根據第一列比較兩份文件

根據第一列比較兩份文件

我有兩個文件,我想獲得一個新文件,其中僅包含第一個文件中的行,但不包含第二個文件中的行。例子:

文件1:

ID      firstname        lastname
1       John             Wilkens
2       Andrea           Smith
3       Matthew          Freberg
4       Brenda           Something

文件2:

ID      firstname        lastname
1       John             Wilkens
2       Andrea           Willems
3       Jay              Freberg
5       Mike             Hart

輸出:

ID      firstname        lastname
4       Brenda           Something

我嘗試使用 comm,但這也給出了發生更改的行,例如 ID 2 和 3。

你能幫我解決這個問題嗎?

答案1

$ awk 'NR==FNR{a[$1]; next} FNR==1 || !($1 in a)' file2 file1
ID      firstname        lastname
4       Brenda           Something
  • NR==FNR{a[$1]; next}使用第一列來file2建立數組鍵
    • NR追蹤迄今為止讀取的記錄總數,FNR僅記錄目前正在讀取的檔案的記錄號。因此NR==FNR僅適用於第一個文件(假設它不為空)
  • FNR==1 || !($1 in a)對於file1文件,列印標題行或如果在數組中找不到第一列a
  • awk -F'\t' '...'如果您的輸入以製表符分隔且awk -F, '...'以逗號分隔,則使用。

如果第一個檔案可以為空,請使用:

awk '!f{a[$1]; next} FNR==1 || !($1 in a)' file2 f=1 file1

這將f在兩個文件之間設置一個標誌。

答案2

在 bash 命令列上,您可以執行以下操作。從 file2 中過濾 ID 並在 file1 中查找它們,但僅在行首查找:

$ grep -vf <(< file2 tail -n+2 | grep -Eo '^[^ ]{1,}'|sed 's/.*/^& /') file1
ID      firstname        lastname
4       Brenda           Something

相關內容