Awk
根據第一列比較 2 個文件並列印不匹配的
文件#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