[英]How to find the non matching records between two files using awk
文件 1
1|footbal|play1
2|cricket1|play2
3|golf|play3
4|tennis|play4
5|bowling|play5
檔案 2
1|footbal|play1
2|cricket|play2
4|tennis|play4
我正在比較 file2 和 file1 並且輸出應該是
3|golf|play3
5|bowling|play5
我只需要文件 2 中不存在而應該在文件 1 中的記錄。
awk 'NR==FNR {exclude[$0];next} !($0 in exclude)' file2.txt file1.txt
這沒有給出預期的結果。
編輯:通過將第一個字段作為索引鍵,再次嘗試獲得 OP 的預期輸出。
awk '
BEGIN{
FS="|"
}
NR==FNR{
exclude[$1]
next
}
!($1 in exclude)
' file2.txt file1.txt
您的代碼看起來不錯,能否請您嘗試以下操作,如果您的示例中有控制 M 個字符,請嘗試以下操作。 在處理它們之前嘗試刪除它們。
awk '{gsub(/\r|[[:space:]]+$/,"")} NR==FNR {exclude[$0];next} !($0 in exclude)' file2.txt file1.txt
我還刪除了最后一行的空格,以防萬一。
您當然可以使用 awk,但comm
是專門為打印出兩個文件之間的共性和差異而構建的:
$ comm -23 file1.txt file2.txt
3|golf|play3
5|bowling|play5
(鑒於您的預期輸出,我假設您的示例文件 1 中的cricket1
是一個錯字)。
問題是文件必須按字典順序排序,而根據您的樣本,您的文件將根據第一列按數字排序,一旦您有 10 或更高的列,則不同。 因此,可能需要稍作更改(需要bash
、 zsh
或其他理解<(command)
語法的 shell:
comm -23 <(sort file1.txt) <(sort file2.txt)
comm
接受三個重要參數 - -1
,它禁止只出現在第一個文件中的行, -2
,它禁止只出現在第二個文件中的行,以及-3
,它禁止出現在兩個文件中的行。 所以-23
最終只打印第一個文件獨有的行。 -13
將打印第二個文件獨有的行。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.