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