gpt4 book ai didi

linux - 想要使用 awk 根据顺序切换 2 个值

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:48:00 24 4
gpt4 key购买 nike

我对 awk/sed/grep 很不熟悉,一直在努力寻找问题的解决方案。我有一个看起来像这样的 BIOS 配置文件..

...

Dual Boot Order #1=0001

Dual Boot Order #2=0002

Dual Boot Order #3=0003

...

Dual Boot Order #15=000E

...

我想做的是检测某个值是否在#1 位置,如果不是,稍后在启动顺序列表中找到它,并将其切换为当前在#1 位置的任何值.例如,如果我想优先考虑 000E 引导选项,我希望我的输出是..

...

Dual Boot Order #1=000E

Dual Boot Order #2=0002

Dual Boot Order #3=0003

...

Dual Boot Order #15=0001

...

我目前正在将#1 中的值存储在一个 shell 变量中,并计划检查它并根据该值执行下一个命令。

temp=$(awk '/Dual Boot Order #1=..../ { if ( $4 != "#1=000E" ) print $4 }' file.txt)

之后我还需要保存这些更改。任何人都知道更直接的方法来完成这个?谢谢!

最佳答案

让我们从这个测试文件开始:

$ cat configfile 
...
Dual Boot Order #1=0001
Dual Boot Order #2=0002
Dual Boot Order #3=0003
...
Dual Boot Order #15=000E
...

现在,如果我们想将 000E 换成第一位:

$ awk -v x=000E '$4~x {sub(/=.*/, a, $4)} $4~/#1=/{a=$4; sub(/^[^=]*/, "", a); $4="#1="x} 1' configfile
...
Dual Boot Order #1=000E
Dual Boot Order #2=0002
Dual Boot Order #3=0003
...
Dual Boot Order #15=0001
...

如果您有 GNU awk (gawk) 并且您想就地更改文件:

gawk -i inplace -v x=000E '$4~x {sub(/=.*/, a, $4)} $4~/#1=/{a=$4; sub(/^[^=]*/, "", a); $4="#1="x} 1' configfile

工作原理

  • -v x=000E

    这定义了一个 awk 变量 x,其值为 000E

  • $4~x {sub(/=.*/, a, $4)}

    如果第四个字段是 x 的正则表达式匹配,则将其更新为 a(从 #1 保存的值)。

  • $4~/#1=/{a=$4; sub(/^[^=]*/, "", a); $4="#1="x}

    如果第四个字段用于#1,则 (a) 将其当前值保存到 a 并且 (b) 将其值更新为 x.

  • 1

    这是 awk 的 print-the-line 的神秘简写。

关于linux - 想要使用 awk 根据顺序切换 2 个值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39711154/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com