2010-08-23 168 views
1

我有2個文本文件要比較他們的第一列。以下comm命令正確顯示2個文件中的公共行。比較兩個文件

comm develop1.txt qa1.txt -12 

但是下面的diff命令不會按預期顯示差異。

diff develop1.txt qa1.txt --side-by-side 

預期的輸出結果如下:

mysql-data/webservice 280292 | mysql-data/webservice 28684 

但是這兩個值都沒有在同一條線上,因爲在最後一列的數量是不同的。我確實需要比較並排格式的數字。 如何實現?

+0

#加入develop1.txt QA1。 txt#正在做我正在尋找的東西。 #現在有人可以讓我知道如何在一個文件中找到那些文件,但不在第二個文件中? – shantanuo 2010-08-23 04:47:32

+0

我的解決方案應該給你那些在一個文件,但不是其他。它不像聯合解決方案那麼優雅,所以如果有人得到了這個(優雅地),忽略我的答案。如果沒有,你可以使用它。我會更新它來更好地解釋。 – paxdiablo 2010-08-23 04:55:21

回答

3

如果你彌補東西快速和骯髒的(不是我會釋放到生產的,但肯定好我自己的目的):

for key in $(cat develop1.txt qa1.txt | awk '{print $1}' | sort -u) ; do 
    devval=$(grep "^${key} " develop1.txt | awk '{print $2}') 
    qa1val=$(grep "^${key} " qa1.txt | awk '{print $2}') 
    if [[ "${devval}" != "${qa1val}" ]] ; then 
     echo "$key: dev=[${devval}], qa=[${qa1val}]" 
    fi 
done 

第一行代碼從兩個文件中的所有獨特的鍵到一個列表(如果你的密鑰有空格但是這很可能使任何解決方案難以實現,這將不起作用,並且在這裏似乎不是這種情況)。

第二行和第三行只是從兩個文件中獲取每個鍵的值。

if語句然後打印出鍵和兩個值,但只有值不同。

不夠漂亮,甚至沒有經過徹底測試,但它可能足以滿足您的需要。您必須警惕邊緣情況,例如密鑰可能在文件中多次存在的可能性,或密鑰可能不在行首的地方。

+0

##/mysql-data/support16:/ mysql-data/support16 5880:/ mysql-data/support16 438748 ##是否可以抑制這樣的線? #我希望只看到一個文件中的數據庫不在其他文件中。 – shantanuo 2010-08-23 05:09:51

+0

@shantanuo,我已經修復了這個問題,以至於你沒有三次得到鑰匙(這是我的疏忽,對不起)。現在只有一個關鍵字的文本應該包含文本'[]'(比如'/ mysql-data/support16:dev = [5880],qa = []'),所以你可以通過'|' grep'\\ [\\]''向你展示這些。 – paxdiablo 2010-08-23 05:28:27

1

我不確定我完全理解你想要做什麼。你嘗試使用join命令嗎?考慮到只包含你所給出的示例行兩個文件,結果會是這樣:

$ join develop1.txt qa1.txt 
mysql-data/webservice 280292 28684 

你可以告訴join輸出unpairable線有:

$ join -a1 -a2 develop1.txt qa1.txt 
+0

謝謝。換句話說,我想要做的是... #mylist ='join develop1.txt qa1.txt | awk'{print $ 1}'' ## join -a1 -a2 develop1.txt qa1.txt | grep -v'$ mylist' ##不工作! – shantanuo 2010-08-23 05:48:41

+0

@shantanuo - 如果每行只有兩列,則嘗試'join -a1 -a2 file1 file2 | awk'NF == 2 {print; }'' – abyx 2010-08-23 06:14:54

+0

這不會幫助我理解所顯示的值是來自第一個文件還是第二個文件。 – shantanuo 2010-08-23 08:01:58

1

我知道我要說的不完全是你問的,但你有沒有嘗試過一個視覺比較程序?這樣的WinMerge(用於Windows)或Meld(用於Linux)?其界面的預覽如下(從谷歌圖像拍攝):

的WinMerge:

alt text

MELD:

alt text