将 awk 单行代码从识别匹配的列对(逐行)扩展到多列

将 awk 单行代码从识别匹配的列对(逐行)扩展到多列

我在使用 Win7 和 Cygwin。我有一行代码可以用于识别一对列中的匹配项,但当我尝试引入其他列(即 >2)时,我无法让它工作。因此,以下方法对我有用:

gawk -F "^" '{ if ($3 == $7) print "0"; else print $3,$7; }' infile.txt > outfile.txt

但是,当我添加另一对列时,出现语法错误:

gawk -F "^" '{ if ($3 == $7 || $3 == $11) print "0"; else print $3,$7,$11; }' infile.txt > outfile.txt

所以命令有问题,但错误消息对我来说没什么帮助。当我用“&&”替换“||”时,我也收到错误(“第一个“$7”后面紧接着出现意外的换行符或字符串结尾”,以及“$3 未被识别为内部或外部命令、可操作程序或批处理文件”)。

这是一个示例输入文件,包含三行,以“^”作为列分隔符:

paris^london^new york^paris^rome^paris

paris^london^munich^paris^rome^paris

paris^london^munich^berlin^rome^paris

我希望能够查看文件的每一行中的第 1、4 和 6 列是否相互匹配。因此,在这种情况下,第 1 行是“是”,第 2 行是“是”,第 3 行是“否”。因此,输出应该显示“0”表示“是”,或者重复整行表示“否”。因此输出将是:

0
0
paris^london^munich^berlin^rome^paris

有任何想法吗 ?

答案1

尽量||避免&&

  • 用于&&测试

    gawk -F "^" '$3 == $7{if($3 == $11){print "0"; next;}}{print $3,$7,$11}'

  • 用于||测试

    gawk -F "^" '$3 == $7{print "0"; next;}$3 == $11{print "0"; next;}{print $3,$7,$11}'

答案2

终于明白了。我在 Win7 上使用 Cygwin。单引号不好用,所以用双引号替换所有单引号可以修复语法,此外,“||”不好用,但“&&”可以正常工作。因此以下内容有效:

gawk -F "^" "{如果 ($1 == $2 && $3 == $4 && $4 == $5 && $5 == $6) 打印 0; 否则打印 $1,$2,$3; }" infile.txt > outfile.txt

相关内容