Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/17.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 识别unix中两个文件的差异_Bash_Unix_Awk_Scripting_Text Processing - Fatal编程技术网

Bash 识别unix中两个文件的差异

Bash 识别unix中两个文件的差异,bash,unix,awk,scripting,text-processing,Bash,Unix,Awk,Scripting,Text Processing,我有两个文件rec1.txt和rec2.txt 及 我提供的比较如下:- [gpadmin@subh ~]$ diff -y ret1.txt ret2.txt emcas_fin_bi=324 | emcas_fin_bi=333 emcas_fin_drr=3294 | emcas_fin_drr=5528 emcas_fin_exp=887

我有两个文件rec1.txt和rec2.txt

我提供的比较如下:-

[gpadmin@subh ~]$ diff -y ret1.txt ret2.txt
emcas_fin_bi=324                                 | emcas_fin_bi=333
emcas_fin_drr=3294                               | emcas_fin_drr=5528
emcas_fin_exp=887                                | emcas_fin_exp=1134
emcas_fin_optics=0                                 emcas_fin_optics=0
emcas_gbo_gs=3077                                | emcas_fin_revpro=0
                                                 > emcas_gbo_gs=3897
我认为这是上述输出的错误输出,因为emcas_gbo_gs很常见,但显示为新词:-

emcas_gbo_gs=3077                                | emcas_fin_revpro=0
                                                 > emcas_gbo_gs=3897
期望输出:-

emcas_gbo_gs=3077                                | emcas_gbo_gs=3897
                                                 > emcas_fin_revpro=0
diff工具比较行而不是关键字。即使是最小的选项也不能产生你想要的结果,至少在我的机器上是这样

我看到两种解决办法:

始终在文件末尾添加新关键字。 将对值的更改与添加或删除关键字分开。 救命啊

$ awk -F= 'NR==FNR {a[$1]=$2; next} 
           $1 in a {if(a[$1]!=$2) print $1 FS a[$1] "\t!" $0; 
                    delete a[$1]; next} 
                   {print " \t>" $0}  
               END {for(k in a) print ">" k"="a[k]}' f1 f2 | column -ts$'\t'

emcas_fin_bi=324    !emcas_fin_bi=333
emcas_fin_drr=3294  !emcas_fin_drr=5528
emcas_fin_exp=887   !emcas_fin_exp=1134
                    >emcas_fin_revpro=0
emcas_gbo_gs=3077   !emcas_gbo_gs=3897

你想要的输出和你得到的是相同的,除了订单,你的订单重要吗????,请考虑添加完整的预期OutPosie@ Enter,因为我的输出是错误的,在第二列EcCasgGBOIGS匹配的第一列,但它作为一个新的条目显示,并与其他EMCAS匹配…这是错误的。所以您只需要两个文件中的唯一值??基于“=”之前的值的唯一值??好的。。。我会尝试用另一种方式来处理这个问题。。。你可以用第一个文件减去第二个文件,帮我找出第三个文件中两个文件的差异。但是第二个文件中的任何新条目也应该在最后一个文件中捕获。您真的需要将输出格式设置为与diff完全相同的列吗?好的。。。我会尝试用另一种方式来处理这个问题。。。你可以用第一个文件减去第二个文件,帮我找出第三个文件中两个文件的差异。但是第二个文件中的任何新条目也应该在最后一个文件中被捕获。你发布了我见过的最恐怖的awk之一:前置感叹号!有了管道和空间|,老眼睛再也看不清楚了……@Inder,每个单独的陈述都应该很容易理解。将它们放在一起可能需要一些经验,但不需要分析。@karakfa,emcas_fin_optics=0在运行awk后丢失。为什么?即使在我运行这个awk时没有更多的条目,我也无法获得所有的输出。缺少的很少,因为两个文件中的内容相同,所以没有区别。
emcas_gbo_gs=3077                                | emcas_gbo_gs=3897
                                                 > emcas_fin_revpro=0
$ awk -F= 'NR==FNR {a[$1]=$2; next} 
           $1 in a {if(a[$1]!=$2) print $1 FS a[$1] "\t!" $0; 
                    delete a[$1]; next} 
                   {print " \t>" $0}  
               END {for(k in a) print ">" k"="a[k]}' f1 f2 | column -ts$'\t'

emcas_fin_bi=324    !emcas_fin_bi=333
emcas_fin_drr=3294  !emcas_fin_drr=5528
emcas_fin_exp=887   !emcas_fin_exp=1134
                    >emcas_fin_revpro=0
emcas_gbo_gs=3077   !emcas_gbo_gs=3897