awk中的更多输入文件

时间:2019-03-23 11:21:40

标签: awk

我有一个代码:

/Curve No./ { in_f_format=1; next } 
/^[[:space:]]*$/ { in_f_format=0; next } 
{sum2+=$2; sum3+=$3} END{printf("%.6f\n",sum3/sum2)}

在文本文件中找到一个表并提供计算。结果是来自一个文件的一个数字。 如何获取更多文件的结果列。我写道:

awk -f program.awk file??.txt

我只有一个结果-file01.txt

输入文件01

    Curve     No. of obs.   Sum of squares
      1           82        0.81604656
      2         7200    96272.93714063
      3         7443   110384.79793831

jkjl

输入文件02

    Curve     No. of obs.   Sum of squares
      1           82        0.81604656
      2         7200    96272.93714063
      3         7443   110384.79793831

jkjl

所需输入-如果有两个输入文件,则为两个数字。

14.034536
14.034536

1 个答案:

答案 0 :(得分:4)

awk '
FNR==1{argind++}                          # if you are on GNU awk, remove this and...
/Curve No./ { in_f_format=1; next } 
/^[[:space:]]*$/ { in_f_format=0; next } 
{sum2[argind]+=$2; sum3[argind]+=$3}      # ... replace argind with ARGIND here
END{
    for(i=1;i<=argind;i++)                # ... and here.
        printf("%.6f\n",sum3[i]/sum2[i])
}' file1 file2

输出:

14.034537
14.034537

如果您使用的是GNU awk,则可以将argind替换为内置的ARGIND并删除FNR==1块。

更新

如果您使用的是GNU awk,则可以使用ENDFILE

$ awk '/Curve No./ { in_f_format=1; next } 
/^[[:space:]]*$/ { in_f_format=0; next } 
{sum2+=$2; sum3+=$3} 
ENDFILE {                                   # ENDFILE after every file
    printf("%.6f\n",sum3/sum2)              # print 
    sum3=sum2=0                             # reset vars
}' file file                                # all those files
14.034537
14.034537

另一个更新

或者您可以移动printf并删除END块:

$ awk '/Curve No./ { in_f_format=1; next } 
/^[[:space:]]*$/ { 
    in_f_format=0
    printf("%.6f\n",sum3/sum2)               # move it here
    sum2=sum3=0                              # reset vars
    next
} 
{sum2+=$2; sum3+=$3}' file file
14.034537
14.034537