Bash 如何找到整数值并进行比较,然后传输主文件?

Bash 如何找到整数值并进行比较,然后传输主文件?,bash,scripting,grep,fortran,string-comparison,Bash,Scripting,Grep,Fortran,String Comparison,我有一些.log的输出文件(5000个文件),它们是QM计算的结果。在每个文件中,有两条特殊的线表示电子和轨道的数量,如下例所示(输出文件中的确切空格): 我考虑使用一个脚本(bash或Fortran)来解决这个问题,该脚本(同时)grep这两行并获得相应的整数值(例如9和13),比较它们并找出两个值之间的差异,最后将它们与相应的文件名一起列在一个新的文本文件中。 我真的非常感谢您提供的任何帮助。这不是一个好办法(但会奏效)—— 读取文件时 做 first=$(awk-F='/^Number/{

我有一些.log的输出文件(5000个文件),它们是QM计算的结果。在每个文件中,有两条特殊的线表示电子和轨道的数量,如下例所示(输出文件中的确切空格):

我考虑使用一个脚本(bash或Fortran)来解决这个问题,该脚本(同时)grep这两行并获得相应的整数值(例如9和13),比较它们并找出两个值之间的差异,最后将它们与相应的文件名一起列在一个新的文本文件中。 我真的非常感谢您提供的任何帮助。

这不是一个好办法(但会奏效)——

读取文件时
做
first=$(awk-F='/^Number/{print$2}''“$file”| head-1)
second=$(awk-F='/^Number/{print$2}'“$file”| tail-1)
如果[“$first”-gt“$second”]
然后
echo$(“$first”-“$second”))
其他的
echo$(“$second”-“$first”))
fi>“$file”\u答案;
完成<列出所有文件
此方法拾取(在
awk
一行中)的值并进行比较

然后减去它们,得到一个值,保存在名为“$file”\u-answer的文件中。即,名称的后缀为“\u-answer”的初始文件名


您可能需要调整此代码以完全符合您的目的。

我在
GNU Awk
中发布了一个尝试,并且仅在该版本中对其进行了测试

#!/bin/bash

for file in *.log
do
    awk -F'=[[:blank:]]*' '/Number of/{printf "%s%s",$2,(NR%2?" ":RS)}' "$file" | awk 'function abs(v) {return v < 0 ? -v : v} {print abs($1-$2)}' >> output_"$file"
done

整个文件中仅存在这两行中的一个实例?@Amir您迄今为止尝试了什么?这是一个相对简单的
awk
问题。请查看一些文档或在线教程,而不是不尝试就提问。要开始,请尝试
awk-F='/^Number/{print$2}'文件
,它将为您提供要减去的值。然后您可以将它们保存在变量中,然后在
awk
本身中进行减法或求差。然后就是重定向到输出文件的问题。@i在每个文件中只有这两个特殊行,没有类似的行present@VarunM我真的试过了me grep-w和grep-Eo带有“和”&“或”条件命令。但首先,它们中没有一个给了我精确对应的整数值,其次,该命令不能单独工作,这就是为什么我考虑编写一个包含所有命令的脚本。很抱歉,我对脚本和命令完全是初学者。非常感谢您的帮助!代码工作完美。但还有一个问题,如果我不想得到两个值减去的绝对值(负值也很重要),那么应该对代码进行哪些更改?是的,非常有效。谢谢你,我真的非常感谢你的帮助,非常感谢!@Amir:很高兴提供帮助!非常感谢Varun M对你的帮助和回答!不幸的是,代码对我不起作用,但我非常感谢你的帮助。我甚至试图更改代码以消除错误但是它不再起作用了。但是再次感谢你!
while read file
do
    first=$(awk -F= '/^Number/ {print $2}' "$file" | head -1) 
    second=$(awk -F= '/^Number/ {print $2}' "$file" | tail -1) 

    if [ "$first" -gt "$second" ] 
    then 
        echo $(("$first" - "$second")) 
    else 
        echo $(("$second"  - "$first"))
    fi > "$file"_answer ; 
done < list_of_files
#!/bin/bash

for file in *.log
do
    awk -F'=[[:blank:]]*' '/Number of/{printf "%s%s",$2,(NR%2?" ":RS)}' "$file" | awk 'function abs(v) {return v < 0 ? -v : v} {print abs($1-$2)}' >> output_"$file"
done
awk -F'=[[:blank:]]*' '/Number of/{printf "%s%s",$2,(NR%2?" ":RS)}' "$file" | awk '{print ($1-$2)}' >> output_"$file"