Grep
區分相似的行
我想列印一個行列表,其中兩個文件中的第一個單詞相同,而其餘單詞則不同。一些複雜的混亂
comm
,grep
並且cut
是可能的,但希望有一個更簡單的方法。編輯:我設法將一些工作程式碼拼湊在一起。範例測試:
$ cat file1 a 1 E b 2 F c 3 G $ cat file2 a M X b 2 Y c 3 G $ difff 1 file1 file2 # Differences in fields 2+3 1,2c1,2 < a 1 E < b 2 F --- > a M X > b 2 Y $ difff 1-2 file1 file2 # Differences in field 3 only 1c1 < b 2 F --- > b 2 Y
編輯 2:速度現在可以忍受(在半秒內比較 1800 和 8700 行的兩個文件)。
假設
file1
和file2
都已排序(否則join
將不起作用):diff -u file1 file2 | grep -E "^[+-]($(echo $(join -o0 file1 file2) | tr ' ' '|'))"
解釋:
該
join
命令將輸出出現在兩個文件中的連接欄位(即在兩個文件中相同的行的第一個單詞),每行一個。echo
不過,我們tr
用豎線 (|
) 替換所有空格。進行稍微複雜的處理echo
(而不僅僅是join
直接通過管道傳輸結果tr
)的原因是,輸出join
的末尾將有一個換行符,我們不想用管道替換它。對於範例文件(OP 在編輯問題之前最初給出的文件),
join
,echo
,tr
thingy 將產生bar|foo
. 這是用作擴展正則表達式的一部分,grep -E
用於過濾diff -u
.命令行的輸出是:
-bar c d +bar x y