Linux 如何使用fortran或shell在同一文件的右侧突出显示不匹配的数据?
经过很多努力,我找不到任何合适的命令来满足我的要求。我有两个不同的数据文件,有一列,但长度不等。我的两个文件的一部分是:Linux 如何使用fortran或shell在同一文件的右侧突出显示不匹配的数据?,linux,shell,unix,fortran,Linux,Shell,Unix,Fortran,经过很多努力,我找不到任何合适的命令来满足我的要求。我有两个不同的数据文件,有一列,但长度不等。我的两个文件的一部分是: file1.dat file2.dat 23.99 23.99 45.950 45.951 5 6 23 23 43 34 我希望在相同的文件中突出显示不匹配的数据(最多2个小数点),如下所示: file1.dat
file1.dat file2.dat
23.99 23.99
45.950 45.951
5 6
23 23
43
34
我希望在相同的文件中突出显示不匹配的数据(最多2个小数点),如下所示:
file1.dat
23.99
45.950
5 not present
23
file2.dat
23.99
45.951
6 not present
23
43 not present
34 not present
有几种工具可以为您做到这一点(tkdiff、meld、vimdiff)。然而,SO不是一个列出工具清单的地方,而是一个回答如何解决问题的地方 vimdiff与diff不同。它是一个使用vim显示差异的脚本,您可能已经有了它。有几个例子,在网上搜索很容易找到。 这些页面提到了一些工具:
wdiff
)。把它看作是后来的版本(它仍然是可访问的,尽管我记得它存在的问题)。
如果我正在开发一个脚本来执行请求,我建议它以diff-u
格式生成输出。这将允许您重用colordiff
程序,解决大约一半的问题。然后,我会这样做:
- 将每个输入文件过滤为临时文件,将超过第二个小数点的数字删除
- 在临时文件上运行
diff-u
- 从
读回结果,并使用行号信息合并到原始行中diff-u
最后一步需要有经验的开发人员花2-3个小时来编写,因此演示一个示例超出了范围。我编写了一个简单的脚本,它可以帮助您或其他人 首先,我们将把file1.dat与file2.dat结合起来,并将两者输出到名为output.dat的文件中,两列的内容如下
|23.99 : 23.99|
|45.950 : 45.951|
|5 : 6|
|23 : 23|
| : 43|
| : 34|
用awk粘贴
:|paste -d ' : ' file1.dat - file2.dat > output.dat | awk -F '|' '{print "|" $1 "|" $8}' output.dat
然后比较两列中突出显示的箭头
awk -F : '{if(!($1==$2))printf("%s", "'$RED'=>'$NORMAL'not");print" matched ",$0}' output.dat
突出显示箭头的颜色
RED=`echo -e '\033[41m\033[37m'`
NORMAL=`echo -e '\033[0m'`
结果是这样的
present 23.99 :23.99
=>not present 45.950 :45.951
=>not present 5 :6
present 23 :23
=>not present :43
=>not present :34
完整脚本:
#!/bin/bash
RED=`echo -e '\033[41m\033[37m'`
NORMAL=`echo -e '\033[0m'`
:|paste -d ' : ' file1.dat - file2.dat > output.dat | awk -F '|' '{print "|" $1 "|" $6}' | awk -F : '{if(!($1==$2))printf("%s", "'$RED'=>'$NORMAL'not");print" present ",$0}' output.dat
有几种工具可以为您做到这一点(tkdiff、meld、vimdiff)。然而,SO不是一个列出工具列表的地方,而是一个回答如何解决问题的地方。我刚刚开始学习Linux。有人建议我Linux可以让它更简单。我尝试了diff file1.dat file2.dat>myfile.dat。但它并没有给出我的结果。无论如何,感谢您的建议@thomasdickey,它将显示整行差异,而不是OP要求的“最多2个小数点”的部分差异。(如果是这么简单,我会提到colordiff和类似的程序)。但我将两个文件合并到另一个输出中。dat将一个文件作为两列,然后在这两列之间进行比较。如果最多比较
45.950:45.951
的两个小数位,则会忽略第三个小数位,并表示其余的比较相等。您关于合并和列的评论似乎与此无关。如果OP对学习如何使用而不仅仅是使用工具更感兴趣,那么这些将是有趣的阅读材料。@authprivate谢谢你的脚本。Roselover按照我的要求解决了。@ThomasDickey非常感谢您的建议和支持。现在Roselover的项目使它成功了。