我有 awk 命令來輸出比較 2 列的匹配行資料,盡管我想輸出相反的、不匹配的資料。
#file1.csv
box1,apple
box2,banana
#file2.csv
data24,box1,apple,text
date25,box1,banana,text
通過 AWK 我有,
awk -F',' 'NR==FNR{a[$1,$2]; next} ($2,$3) in a' file1.csv file2.csv
輸出看起來像:
data24,box1,apple,text
并希望擁有:
banana,box2
在這種情況下,簡單的否定似乎不起作用,您有什么想法嗎?試過 :
awk -F',' 'NR==FNR{a[$1,$2]=1; next} !($2,$1) in a' file1.csv file2.csv
這將輸出:
data24,box1,apple,text
date25,box1,banana,text
uj5u.com熱心網友回復:
您可以反轉操作,而不是反轉邏輯:
awk -F',' 'NR==FNR{a[$1,$2]; next} ($2,$3) in a {next}1' file1.csv file2.csv
date25,box1,banana,text
或者:
awk 'BEGIN{FS=OFS=","}
NR==FNR{a[$1,$2]; next} ($2,$3) in a {next} {print $2, $3}' file1.csv file2.csv
box1,banana
uj5u.com熱心網友回復:
假設:
- 兩個檔案都以逗號分隔
- 從中查找
file1.csv與欄位 #2 和 #3 不匹配的行file2.csv - 對于此類條目(來自
file1.csv)以相反的順序列印欄位(OP 顯示了 的最終輸出banana,box2,這是box2,banana中列出的相反順序file1.csv)
對 OPawk代碼的一些修改:
awk '
BEGIN { FS=OFS="," }
NR==FNR { a[$1 FS $2] ; next } # add a delimiter to allow for splitting of index later
{ delete a[$2 FS $3] } # 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
uj5u.com熱心網友回復:
$ awk 'BEGIN{FS=OFS=","} NR==FNR{a[$2,$3]; next} !(($1,$2) in a){print $2, $1}' file2.csv file1.csv
banana,box2
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/329513.html
