如何找到整数值并比较它们然后传输主文件?
How to find integer values and compare them then transfer the main files?
我有一些 .log 的输出文件(5000 个文件),它们是 QM 计算的结果。在每个文件中,有两条特殊的行表示电子和轨道的数量,如下面的示例(输出文件中的精确空格):
Number of electrons = 9
Number of orbitals = 13
我想到了一个脚本(bash 或 Fortran)作为这个问题的解决方案,它 grep 这两行(同时)并获得相应的整数值(例如 9 和 13 ), 比较它们并找到两个值之间的差异,最后,将它们与相应的文件名一起列在一个新的文本文件中。
如果能提供任何帮助,我将不胜感激。
不好的方法(但它会起作用)-
while read file
do
first=$(awk -F= '/^Number/ {print }' "$file" | head -1)
second=$(awk -F= '/^Number/ {print }' "$file" | tail -1)
if [ "$first" -gt "$second" ]
then
echo $(("$first" - "$second"))
else
echo $(("$second" - "$first"))
fi > "$file"_answer ;
done < list_of_files
此方法获取值(在 awk
一个衬垫中并进行比较。
然后将它们相减得到一个值,该值保存在名为“$file”_answer 的文件中。即以“_answer”作为名称后缀的初始文件名。
您可能需要调整此代码以完全符合您的目的。
我在 GNU Awk
中发布了一个尝试,并且仅在其中进行了测试。
#!/bin/bash
for file in *.log
do
awk -F'=[[:blank:]]*' '/Number of/{printf "%s%s",,(NR%2?" ":RS)}' "$file" | awk 'function abs(v) {return v < 0 ? -v : v} {print abs(-)}' >> output_"$file"
done
我将 AWK
逻辑分成两部分的原因是为了降低在单个大型命令中执行此操作的复杂性。第一部分是以柱状格式从日志文件中提取数字,第二部分是获取它们的绝对值。
我将分解 AWK
逻辑:-
-F'=[[:blank:]]*'
是一个多字符分隔符逻辑,包括 =
和一个或多个 [[:blank:]]
空白字符实例。
'/Number of/{printf "%s%s",,(NR%2?" ":RS)}'
搜索以 Number of
开头的行并以柱状方式打印它,即示例文件中的 9 13
。
第二部分不言自明。我写了一个函数来从两个返回值中获取绝对值并打印出来。
- 每个输出都保存在一个名为
output_
的文件中,供您进一步处理。
运行 命令行中的脚本为 bash script.sh
,其中 script.sh
是包含上述行的名称。
更新:-
如果您也对负值感兴趣,即没有绝对函数,请将 awk
语句更改为
awk -F'=[[:blank:]]*' '/Number of/{printf "%s%s",,(NR%2?" ":RS)}' "$file" | awk '{print (-)}' >> output_"$file"
我有一些 .log 的输出文件(5000 个文件),它们是 QM 计算的结果。在每个文件中,有两条特殊的行表示电子和轨道的数量,如下面的示例(输出文件中的精确空格):
Number of electrons = 9
Number of orbitals = 13
我想到了一个脚本(bash 或 Fortran)作为这个问题的解决方案,它 grep 这两行(同时)并获得相应的整数值(例如 9 和 13 ), 比较它们并找到两个值之间的差异,最后,将它们与相应的文件名一起列在一个新的文本文件中。 如果能提供任何帮助,我将不胜感激。
不好的方法(但它会起作用)-
while read file
do
first=$(awk -F= '/^Number/ {print }' "$file" | head -1)
second=$(awk -F= '/^Number/ {print }' "$file" | tail -1)
if [ "$first" -gt "$second" ]
then
echo $(("$first" - "$second"))
else
echo $(("$second" - "$first"))
fi > "$file"_answer ;
done < list_of_files
此方法获取值(在 awk
一个衬垫中并进行比较。
然后将它们相减得到一个值,该值保存在名为“$file”_answer 的文件中。即以“_answer”作为名称后缀的初始文件名。
您可能需要调整此代码以完全符合您的目的。
我在 GNU Awk
中发布了一个尝试,并且仅在其中进行了测试。
#!/bin/bash
for file in *.log
do
awk -F'=[[:blank:]]*' '/Number of/{printf "%s%s",,(NR%2?" ":RS)}' "$file" | awk 'function abs(v) {return v < 0 ? -v : v} {print abs(-)}' >> output_"$file"
done
我将 AWK
逻辑分成两部分的原因是为了降低在单个大型命令中执行此操作的复杂性。第一部分是以柱状格式从日志文件中提取数字,第二部分是获取它们的绝对值。
我将分解 AWK
逻辑:-
-F'=[[:blank:]]*'
是一个多字符分隔符逻辑,包括=
和一个或多个[[:blank:]]
空白字符实例。'/Number of/{printf "%s%s",,(NR%2?" ":RS)}'
搜索以Number of
开头的行并以柱状方式打印它,即示例文件中的9 13
。第二部分不言自明。我写了一个函数来从两个返回值中获取绝对值并打印出来。
- 每个输出都保存在一个名为
output_
的文件中,供您进一步处理。
运行 命令行中的脚本为 bash script.sh
,其中 script.sh
是包含上述行的名称。
更新:-
如果您也对负值感兴趣,即没有绝对函数,请将 awk
语句更改为
awk -F'=[[:blank:]]*' '/Number of/{printf "%s%s",,(NR%2?" ":RS)}' "$file" | awk '{print (-)}' >> output_"$file"