我有.log的一些输出文件(5000个文件),它们是QM计算的结果。在每个文件里面有两条特殊的线条表示电子和轨道的数量,如下例所示(输出文件中有精确的空格):
my $defaults = $pattern->defaults;
$pattern = $pattern->defaults({foo => 'bar'});
我想过一个脚本(bash或Fortran),作为这个问题的解决方案,grep这两行(同时)并得到相应的整数值(例如9和13),比较它们并找到两个值之间的差异,最后,将它们列在具有相应文件名的新文本文件中。 我非常感谢给予的任何帮助。
答案 0 :(得分:1)
我在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
我将AWK
逻辑拆分为2的原因是为了降低在单个庞大命令中执行此操作的复杂性。第一部分用于以列式格式从日志文件中提取数字,第二部分用于获取其绝对值。
我将细分AWK
逻辑: -
-F'=[[:blank:]]*'
是一个mult0字符分隔符逻辑,包括=
和一个或多个[[:blank:]]
空格字符实例。 '/Number of/{printf "%s%s",$2,(NR%2?" ":RS)}'
搜索以Number of
开头的行,并以列式方式打印,即从示例文件中打印为9 13
。
第二部分是不言自明的。我编写了一个函数来从两个返回值中获取绝对值并打印出来。
output_
的文件中,供您进一步处理。从命令行运行脚本为bash script.sh
,其中script.sh
是包含上述行的名称。
更新: -
如果您对负值感兴趣,即没有绝对函数,请将awk
语句更改为
awk -F'=[[:blank:]]*' '/Number of/{printf "%s%s",$2,(NR%2?" ":RS)}' "$file" | awk '{print ($1-$2)}' >> output_"$file"
答案 1 :(得分:0)
这样做的方法很糟糕(但它会起作用) -
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
此方法获取值(在awk
一个班轮中并比较它们。
然后它会减去它们,为你提供一个值,它保存在名为&#34; $ file&#34; _answer的文件中。即带有&#39; _answer&#39;的初始文件名。作为名称的后缀。
您可能需要调整此代码以完全符合您的用途。