Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用bash脚本比较两个文件_Bash_Scripting_File - Fatal编程技术网

使用bash脚本比较两个文件

使用bash脚本比较两个文件,bash,scripting,file,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;

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

我有两个文件:

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
这看起来没那么难,可能粘贴就足够了,但有一个陷阱。有些行只在其中一个文件中,而不在另一个文件中。在这种情况下,我需要在第二个文件的行上等待,并且仍然与第一个文件进行比较

例如:

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
但我可以自己完成


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

如果第一个文件不是太大,您可以这样做(
test1
test2
是按您指定的顺序排列的两个文件):


使用Bash进程替换(
感谢您发布包含边缘案例的示例输入。您是否也可以发布此案例的预期输出?它是否必须在
bash
中,或者我们是否可以切换到python之类的适当编程语言?感谢回复标记,我编辑了包含边缘案例输出的问题。我认为可以在任何我可以运行的程序中完成,我只是想在bash中学习一些新的东西,但不介意任何可行的解决方案:)。不幸的是,它是-大约30 Mb。我遇到了这个错误。“/sc:11:sed:参数列表太长”当我对文件进行排序时。以前我没有得到一些结果,但它写了一条不同的消息-我可以在这里写它,但排序是正确的,不是吗?尽管问题中的数据不包含任何空格,但对$(cat文件)使用
是一个坏习惯
,因为这会将每个单词分成一行。正确的方法是在读-r行时
;做…做
。关于大文件,你是对的。在一个文件中的每行调用那么多实用程序可能会非常慢。另外,你有两次
$number
。应该有两个不同的。那就是我的意思是又一个
echo | grep | sed
。还有一个用来解析
test1
中所需字符串的。太好了,它看起来很有效!我明天要完全试用它-现在需要一些睡眠。但它看起来真的很好。谢谢他们认为我在那里得到了双重\n,因为我们在两个测试中都使用了结尾部分文件,我能处理掉吗?@aGr:你能解释更多关于源数据中的内容以及与问题相关的结果吗?输出中额外的换行符在哪里?在两个文件中使用结尾部分是什么意思?这是使用我给出的两个命令还是仅使用其中一个命令发生的?
#!/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
join -t \; -1 1 -2 2 -o 2.1,2.2,1.2,2.3 <(sort file1) <(sort -t \; -k2,2 file2)
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*;/'