awk 编程 - 有条件地更改字段值

use*_*044 5 scripts awk

我是 awk 编程的初学者。这个帖子是为了澄清一个疑问。我有这样的文件:

70 17 5 mb
71 18 6 ms
72 19 7 ml
73 20 8 mw
Run Code Online (Sandbox Code Playgroud)

其中第 4 列是一个字符串。我想在第 3 列中对第 4 列进行更改。例如:阅读第4列,如果$4=ms$3=$3+1

其实我不知道如何让程序读取字符串ms。

请帮我解决这个问题!

Fli*_*int 9

为此,您需要在 action block 中使用条件语句{}

语法是 if ( expr ) statement

因此,要匹配第 4 列所在的条件,ms然后在匹配条件时重新分配第 3 列的值:

if ($4 == "ms") $3=$3+1

然后使用打印整行 print $0

所以完整的命令如下所示:

awk '{ if ($4 == "ms") $3=$3+1; print $0 }'


lga*_*rzo 6

如果条件简单,您可以使用模式匹配来修改行。

假设test.txt包含示例数据:

cat test.txt
70 17 5 mb
71 18 6 ms
72 19 7 ml
73 20 8 mw
Run Code Online (Sandbox Code Playgroud)

让我们检查以下行及其输出:

awk '/ms$/ {$3++} {print}' test.txt
70 17 5 mb
71 18 7 ms
72 19 7 ml
73 20 8 mw
Run Code Online (Sandbox Code Playgroud)

awk 命令读取每一行的内容test.txt并运行 awk 脚本/ms$/ {$3++} {print}。脚本可以改写为:

/ms$/ {$3++}

      {print}
Run Code Online (Sandbox Code Playgroud)
  • 花括号内的脚本中有两个操作:{}.
    • 第二个更容易解释:它只是打印出整行。
    • 第一个包含操作前的模式规范。该操作只会在匹配的行上运行。模式写在斜杠内://.
      • ms$装置,每个行具有串ms在一行的末尾$(美元符号表示字符串应该是最后就行)。
      • 该操作$3++将第三列的值加一。

请注意该{print}操作将始终运行,因为此操作没有模式,但{$3++}只有在行尾找到字符串“ms”时,模式才会运行。此外,增量发生在打印之前,因此所有必要的修改都将按时执行。