Grep

區分相似的行

  • September 20, 2011

我想列印一個行列表,其中兩個文件中的第一個單詞相同,而其餘單詞則不同。一些複雜的混亂commgrep並且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 行的兩個文件)。

假設file1file2都已排序(否則join將不起作用):

diff -u file1 file2 |
 grep -E "^[+-]($(echo $(join -o0 file1 file2) | tr ' ' '|'))"

解釋:

join命令將輸出出現在兩個文件中的連接欄位(即在兩個文件中相同的行的第一個單詞),每行一個。echo不過,我們tr用豎線 ( |) 替換所有空格。進行稍微複雜的處理echo(而不僅僅是join直接通過管道傳輸結果tr)的原因是,輸出join的末尾將有一個換行符,我們不想用管道替換它。

對於範例文件(OP 在編輯問題之前最初給出的文件),join, echo, trthingy 將產生bar|foo. 這是用作擴展正則表達式的一部分,grep -E用於過濾diff -u.

命令行的輸出是:

-bar c d
+bar x y

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