使用 awk 排除定义模式



我有一个包含两列的文件,并且只有在第二列中找不到确定的图案时才想打印第一列,该文件可以是例如:

3   0.
5   0.
4   1.
3   1.
10  0.

并且只有在第二个文件中没有数字 1 的情况下,我才想打印第一列中的值,即

3
5
10

我知道要打印第一列,我可以使用

awk  '{print $1}' fileInput >> fileOutput

是否有可能在某处有一个 if 块?

通常,您只需要指出您不想匹配的模式:

awk '! /pattern/' file

在这种特定情况下,如果要打印第二列不是"1."的第一行,您可以说:

$ awk '$2 != "1." {print $1}' file
3
5
10

完成条件后,将执行{print $1},以便您将拥有文件的第一列。

在这种特殊情况下,由于1的计算结果为 true,而0的计算结果为 false ,因此您可以执行以下操作:

awk '!$2 { print $1 }' file
3
5
10

{ }前面的部分是执行命令的条件。在这种情况下,!$2表示not第 2 列是true的(即第 2 列是false )。

编辑:即使有尾随点,情况仍然如此。事实上,这三种解决方案都有效:

bash-4.2$ cat file
3   0.
5   0.
4   1.
3   1.
10  0.
bash-4.2$ awk '!$2 { print $1 }' file       # treat column 2 as a boolean
3
5
10
bash-4.2$ awk '$2 != "1." {print $1}' file  # treat column 2 as a string
3
5
10
bash-4.2$ awk '$2 != 1 {print $1}' file     # treat column 2 as a number
3
5
10

最新更新