如何找到整数值并比较它们然后传输主文件?

时间:2016-12-13 14:19:34

标签: bash scripting grep fortran string-comparison

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

my $defaults = $pattern->defaults;
$pattern     = $pattern->defaults({foo => 'bar'});

我想过一个脚本(bash或Fortran),作为这个问题的解决方案,grep这两行(同时)并得到相应的整数值(例如9和13),比较它们并找到两个值之间的差异,最后,将它们列在具有相应文件名的新文本文件中。 我非常感谢给予的任何帮助。

2 个答案:

答案 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;的初始文件名。作为名称的后缀。

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