2010-11-13 55 views
1

我需要一個腳本來編輯文件。我對此已經有點瘋狂了:)。使用bash腳本比較兩個文件

我有兩個文件:

143956;lorem 
143957;ipsum 
143958;lala 
143959;vuvu 

和第二

512;143956;15 
2156;143957;15 
153;143958;4968 
2156;143959;486 

而我需要的是把那兩個文件一起以這樣的方式

512;143956;lorem;15 
2156;143957;ipsum;15 
153;143958;lala;4968 
2156;143959;vuvu;486 

那看起來並不困難,可能paste就足夠了,但這是一個抓住。有些行只在其中一個文件中,但不在另一個文件中。在這種情況下,我需要在第二個文件上等待,並且仍然與第一個文件進行比較。

例子:

143956;lorem 
143957;ipsum 
143959;vuvu //here "lulu" is missing, will compare with 3rd line (143958) but the script wont declare this as "not found" but keep on searching till finds 143959 (which is already on 4 in this case). 

512;143956;15 
2156;143957;15 
153;143958;4968 
2156;143959;486 

輸出應該是這樣的,那麼:

512;143956;lorem;15 
2156;143957;ipsum;15 
2156;143959;vuvu;486 

或更好,這樣

512;143956;lorem;15 
2156;143957;ipsum;15 
153;143958;*WAS NOT FOUND*;4968 
2156;143959;vuvu;486 

但我可以完成這對我自己...

希望這是可以理解的。非常感謝您的幫助。

+0

感謝張貼您的示例輸入包括邊緣的情況下。你還可以發佈這種情況下的預期輸出嗎? – 2010-11-13 22:13:39

+0

是否必須在'bash'中,或者我們可以切換到像Python這樣的編程語言? – 2010-11-13 22:22:56

+0

感謝您的回覆Mark,我編輯了包括邊緣情況輸出在內的問題。 – tsusanka 2010-11-13 22:25:23

回答

1

使用bash進程替換(<())和join實用程序:

join -t \; -1 1 -2 2 -o 2.1,2.2,1.2,2.3 <(sort file1) <(sort -t \; -k2,2 file2) 

或者您可以預設文件。

要輸出出現在file2中,但不會出現在文件1中的記錄:

join -t \; -1 1 -2 2 -v 2 -o 2.1,2.2,1.2,2.3 <(sort file1) <(sort -t \; -k2,2 file2) | sed 's/;;/;*WAS NOT FOUND*;/' 
+0

太棒了,它看起來像它的工作!我明天要試一試 - 現在需要一些睡眠。但它看起來非常棒。謝謝 – tsusanka 2010-11-13 23:29:48

+0

是的這是工作!非常感謝你 – tsusanka 2010-11-14 17:05:38

+0

Theres只是一個人認爲我在那裏得到了雙倍\ n,因爲我們在兩個文件中都使用了最終部分,我可以擺脫那個嗎? – tsusanka 2010-11-14 18:13:57

1

如果第一個文件是不是太大,你可以做(​​test1test2在您指定的順序的兩個文件):

#!/bin/sh 

for line in `cat test2`; do 
    number=`echo "$line" | grep -o ";[0-9]*;" | sed 's/;//g'` 
    repl=`grep "$number;" test1` 
    if [ -z "$repl" ]; then 
    echo "$line" | sed "s#;$number;#;$number;*WAS NOT FOUND*;#g" 
    else 
    echo "$line" | sed "s#;$number;#;$repl;#g" 
    fi 
done 
+0

不幸的是 - 約30 Mb。當我對文件進行排序時,出現此錯誤「./sc:11:sed:參數列表太長」。之前我沒有得到一些結果,但它寫了一個不同的信息 - 我可以寫在這裏,但排序它是正確的事情,或不是嗎? – tsusanka 2010-11-13 23:14:32

+0

儘管問題中的數據不包含任何空格,但使用'for $(cat file)'是一個壞習慣,因爲這會將每個單詞分解到單獨的一行。正確的做法是'while read -r line;做...完成 2010-11-13 23:20:56