2010-11-13 78 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