使用bash脚本比较两个文件

时间:2010-11-13 22:09:43

标签: bash scripting file

我需要一个脚本来编辑文件。我已经对此有点疯狂了:))。

我有两个文件:

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

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

希望这是可以理解的。非常感谢您的帮助。

2 个答案:

答案 0 :(得分: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

答案 1 :(得分: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中出现但未出现在file1中的记录:

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*;/'