
我有兩個文件,我想獲得一個新文件,其中僅包含第一個文件中的行,但不包含第二個文件中的行。例子:
文件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