awk 选择第 1 列与第 2 列部分匹配的行

zzz*_*zzz 2 awk

我有一个如下所示的“example_file”,

a2022.1 a2022.1 80
a2022.1 a2022.2 90
a2022.1 a2023.1 80
a2022.2 a2022.2 90
a2022.2 a2023.1 40
a2022.3 a2022.1 50
b20225.1 a2022.1 80
Run Code Online (Sandbox Code Playgroud)

我想选择第三列 > 80 并且第一列(点之前)与第二列(点之前)不同的行。

所以期望的结果是

a2022.1 a2023.1 80
b20225.1 a2022.1 80
Run Code Online (Sandbox Code Playgroud)

因此,我已经成功地使用下面的行排除了第三列 <80 以及第一列和第二列相同的行

awk '($3 > 80 && $1!=$2)' example_file
Run Code Online (Sandbox Code Playgroud)

我尝试过awk '($3 > 80 && $1!~$2)' example_file,但它并不排除该行

a2022.1 a2022.2 90
Run Code Online (Sandbox Code Playgroud)

我以为这很容易,但我无法弄清楚。有人可以帮忙吗?谢谢!

anu*_*ava 5

你可以使用这个awk

awk -F '[.[:blank:]]' '$NF >= 80 && $1 != $3' file

a2022.1 a2023.1 80
b20225.1 a2022.1 80
Run Code Online (Sandbox Code Playgroud)

这里-F '[.[:blank:]]'将输入字段分隔符设置为点或空白字符。这允许我们将第一列的部分用作 和$1$2将第二列的部分用作$3$4


或者使用gnu-awk

awk '$3 >= 80 && 
    gensub(/\..*/, "", "1", $1) != gensub(/\..*/, "", "1", $2)' file

a2022.1 a2023.1 80
b20225.1 a2022.1 80
Run Code Online (Sandbox Code Playgroud)