我有一个代码:
/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
答案 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