awk 命令将第一列值打印为 1

awk 命令将第一列值打印为 1

如果第 5 列中的值可用且第 1 列和第 2 列值相等且第 3 列和第 4 列值相等,我正在尝试打印第 1 列和第 5 列。对于上述内容,我使用以下命令。

awk 'length($5) && $1=$2 && $3=$4 {print $1" "$5}' filename

下面是我的文件,内容如下

343 222 222 333 333 test
565 444 444 555 555 testi
234 121 121 454 454 
345 676 676 343 343 testin

但我得到的第一列值为 1,输出如下

1 test
1 testi
1 testin

我的命令中有 3 个条件,如果我使用 2 个条件,它就可以正常工作。谁能解释一下为什么我得到的结果是 1 以及如何修复它。

答案1

=是一个作业。用于==比较值。你得到是1因为你本质上拥有$1 = ($2 && $3 = $4)

awk 'NF == 5 && $1 == $2 && $3 == $4 { print $1, $5 }' filename

另请注意,您的数据包含 5 或 6 列,而不是 4 或 5 列,所以也许您打算使用

$ awk 'NF == 6 && $2 == $3 && $4 == $5 { print $1, $6 }' filename
343 test
565 testi
345 testin

NF是一个awk变量,包含当前记录中的字段数。默认输出分隔符 ( OFS) 是空格,因此无需使用 打印显式空格print

另外,如果您想打印显式空格,那么这样做会更具可读性

print $1 " " $6

而不是

print $1" "$6

awk当变量和字符串的值相继出现时,将它们连接起来。变量和字符串之间的空格并不重要。

答案2

Command: awk '{if ((length($6) >0) && ($2==$3) && ($4==$5)) {print $1,$6}}'  filename

输出

veen_linux_example ~]#

 awk '{if ((length($6) >0) && ($2==$3) && ($4==$5)) {print $1,$6}}' filename

343 test
565 testi
345 testin

相关内容