Awk

根據第一列比較 2 個文件並列印不匹配的

  • February 14, 2020

文件#1:

test1,1
test2,2
test3

文件#2:

test2
test1
test4

期望的輸出:

test4

您可以grep為此使用:

$ grep -vwf <(cut -d, -f1 file1) file2
test4

解釋

  • grep選項:
-v, --invert-match
     Invert the sense of matching, to select non-matching lines.
-w, --word-regexp
     Select  only  those  lines  containing  matches  that form 
     whole words.  
-f FILE, --file=FILE
     Obtain patterns from FILE, one per line.  

因此,結合起來,grep -vwf patternFile inputFile意味著“從 patternFile 中找到那些在 inputFile 中永遠不會作為整個單詞出現的行”。

  • <(command):這稱為程序替換,在支持它的 shell(例如 bash)中,它本質上就像一個文件。這使我們能夠將cut命令的輸出用作 grep-f選項的“文件”。
  • cut -d, -f1 file1: 僅列印 file1 的第一個逗號分隔欄位。

請注意,您可能希望使用-x(匹配整行)而不是僅-w當您的數據確實如您顯示的那樣:

 -x, --line-regexp
         Select  only  those  matches  that exactly match the whole line.

所以:

$ grep -vxf <(cut -d, -f1 file1) file2
test4

此外,如果您file1可以包含任何正則表達式字元(.、等) *?您可能還想使用-F

 -F, --fixed-strings
         Interpret PATTERNS as fixed strings, not regular expressions.

所以:

$ grep -Fvxf <(cut -d, -f1 file1) file2
test4

引用自:https://unix.stackexchange.com/questions/567426