2017-09-05 213 views
-2

有兩個文件。當兩個文件中的field1相同時,比較相應的行。如果他們完全一樣,那麼接下來。如果線路多或少或者內容不同,則回顯field1。AWK - 比較兩個文件 - 如果Field1相同,比較行

在下面的例子中,LSP1和LSP2有差異。不同之處在於總行數,但它也可能是field2和/或field3的內容。 LSP3是一樣的。所需的輸出如下。

File1中

LSP1 3.3.3.3 ae3.0 
LSP1 5.5.5.5 ae2.0 
LSP1 4.4.4.4 ae4.0 
LSP1 7.7.7.7 ae1.0 

LSP2 7.7.7.7 ae6.0 
LSP2 3.3.3.3 ae4.0 
LSP2 5.5.5.5 ae6.0 
LSP2 4.4.4.4 ae1.0 
LSP2 2.2.2.2 ae2.0 

LSP3 5.5.5.5 ae4.0 
LSP3 4.4.4.4 ae5.0 
LSP3 7.7.7.7 ae3.0 

文件2

LSP1 3.3.3.3 ae3.0 
LSP1 8.8.8.8 ae2.0 
LSP1 4.4.4.4 ae4.0 
LSP1 7.7.7.7 ae1.0 
LSP1 2.2.2.2 ae2.0 

LSP2 7.7.7.7 ae6.0 
LSP2 3.3.3.3 ae1.0 
LSP2 2.2.2.2 ae2.0 

LSP3 5.5.5.5 ae4.0 
LSP3 4.4.4.4 ae5.0 
LSP3 7.7.7.7 ae3.0 

輸出

LSP1 
LSP2 
+0

請告訴我們具體該解決方案的一部分是你的問題,所以我們可以提供幫助。 – miroxlav

+0

輸入文件中的行是否已排序? –

+0

我已經投票結束這個問題,因爲它似乎是一個工具或解決方案的建議請求,而不是請求您自己的代碼的幫助。這使您的問題脫離了StackOverflow。如果該評估不正確,並且確實需要編寫自己的代碼,請[將您的工作添加到您的問題中](https://stackoverflow.com/posts/46061929/edit),然後我會愉快地收回我的近距離投票。 – ghoti

回答

0
$ comm -3 file1 file2 | awk '$1 { print $1 }' | uniq 
LSP1 
LSP2 

comm -3將輸出僅在file1xor in file2中的行。

awk腳本將從非空行(空格分隔)中提取列1,並且uniq將刪除重複項。

請注意,comm假定排序的輸入。

1

採用單awk的

awk '{ k=$1 FS $2 FS $3 }NR==FNR && NF{ a[k]=$1; next } 
    NF{ if(k in a) delete a[k]; else if(!b[$1]++) print $1 } 
    END{ for(i in a) if(!(a[i] in b)) print a[i] }' file1 file2 

輸出:

LSP1 
LSP2 
+0

不錯。刪除了我的。 –

+0

@MarcLambrichs,謝謝 – RomanPerekhrest

+0

你可以使用$ 0作爲a的索引並去掉k。 –

0
$ awk -v RS= 'NR==FNR{a[$1]=$0;next} $0!=a[$1]{print $1}' file1 file2 
LSP1 
LSP2