【问题标题】:More input files in awkawk 中的更多输入文件
【发布时间】:2019-03-23 21:26:01
【问题描述】:

我有一个代码:

/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

【问题讨论】:

  • 请发布一些具有预期输出的示例数据。
  • 我把它添加到我的问题中
  • 所有文件合并后得到的结果。您需要添加类似FNR==1 { ... start over ... } 的内容(变量 FNR 保存当前文件中的输入行号。)
  • 您想要每个文件的结果,单独的,还是所有文件合并的单个结果?
  • 所有文件的单一结果。我想得到一个包含一列数字的文件 - 一个文件中的一个数字

标签: awk


【解决方案1】:
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

【讨论】:

  • 它适用于我在这里给出的示例,但将其用于原始文件会得到错误的结果
  • 这就是技术。如果您在 END 块中输出,则需要将每个文件的值存储到一个数组/数组中并以某种方式对其进行索引。如果您使用的是 GNU awk,则可以改用 ENDFILE
  • @JamesBrown 我们还在关注你……只是没那么多;-)
  • 为什么它不适用于 leteckaposta.cz/827242331 ?我关心第 23656 行的表。谢谢
  • 该链接似乎无关。你试过其他版本吗?
猜你喜欢
  • 2016-01-17
  • 2015-10-16
  • 2013-02-05
  • 1970-01-01
  • 2012-11-27
  • 2013-09-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多