awk 输出不匹配的行

Awk output unmatched rows

我有 awk 命令输出匹配的行数据比较 2 列, 虽然我想输出相反的、不匹配的数据。

#file1.csv
box1,apple
box2,banana


#file2.csv
data24,box1,apple,text
date25,box1,banana,text

通过 AWK,我有,

awk -F',' 'NR==FNR{a[,]; next} (,) in a' file1.csv file2.csv

输出如下:

data24,box1,apple,text

并希望拥有:

banana,box2

简单的否定在这种情况下似乎不起作用,请问您有什么想法吗? 试过:

awk -F',' 'NR==FNR{a[,]=1; next} !(,) in a' file1.csv file2.csv

将输出:

data24,box1,apple,text
date25,box1,banana,text

假设:

  • 两个文件都是逗号分隔的
  • file1.csv 中查找与 file2.csv
  • 中的字段 #2 和 #3 不匹配的行
  • 对于此类条目(来自 file1.csv)以相反的顺序打印字段(OP 显示了 banana,box2 的最终输出,这是 box2,banana 中列出的相反顺序 file1.csv)

对 OP 的 awk 代码进行了一些修改:

awk '
BEGIN   { FS=OFS="," }
NR==FNR { a[ FS ] ; next }           # add a delimiter to allow for splitting of index later
        { delete a[ FS ] }           # delete file #1 entries if found in file #2
END     { for (i in a) {                 # anything left in array was not found in file #2
              split(i,arr,FS)            # split index on delimiter
              print arr[2],arr[1]        # print fields in reverse order
          }
        }
' file1.csv file2.csv

这会生成:

banana,box2

您可以反转操作,而不是反转逻辑:

awk -F',' 'NR==FNR{a[,]; next} (,) in a {next}1' file1.csv file2.csv
date25,box1,banana,text

或者:

awk  'BEGIN{FS=OFS=","} 
NR==FNR{a[,]; next} (,) in a {next} {print , }' file1.csv file2.csv
box1,banana
$ awk 'BEGIN{FS=OFS=","} NR==FNR{a[,]; next} !((,) in a){print , }' file2.csv file1.csv
banana,box2