簡體   English   中英

如何使用awk查找兩個文件之間不匹配的記錄

[英]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 或更高的列,則不同。 因此,可能需要稍作更改(需要bashzsh或其他理解<(command)語法的 shell:

comm -23 <(sort file1.txt) <(sort file2.txt)

comm接受三個重要參數 - -1 ,它禁止只出現在第一個文件中的行, -2 ,它禁止只出現在第二個文件中的行,以及-3 ,它禁止出現在兩個文件中的行。 所以-23最終只打印第一個文件獨有的行。 -13將打印第二個文件獨有的行。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM