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
我有 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