Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/25.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
Linux 如何使用fortran或shell在同一文件的右侧突出显示不匹配的数据?_Linux_Shell_Unix_Fortran - Fatal编程技术网

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的项目使它成功了。