將 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 "^" "{ if ($1 == $2 && $3 == $4 && $4 == $5 && $5 == $6) print 0; else print $1,$2,$3; }" infile.txt > outfile.txt

相關內容