繁体   English   中英

如何在多个文件上使用 awk?

[英]How to use awk on multiple files?

我正在使用 Linux。 我写了一些看起来像这样的代码:

for x in {10..20}:{00..59}; do awk -F';' '/'"$x"'/ {y+=$7} END {print y}' Data26092019; done

如何在多个文件上使用此命令,例如:Data26092019 和 Data27092019?

文件是这样的:

09:55:13;ACSEL;4.850;16;77.60;1;1
09:55:13;ACSEL;4.850;40;194.00;2;1
09:55:13;ACSEL;4.850;465;2255.25;3;1
...

Output 示例:

Data26092019 4988 10:00
Data26092019 2778 10:01
...
Data27092019 3252 10:00
Data27092019 3002 10:01

也许它应该与另一个 for 循环一起使用,或者您可以指定文件。

主要命令是:

for x in {10..20}:{00..59}; do awk -F';' '/'"$x"'/ {y+=$7} END {print y}' Data26092019; done

它必须在Data26092019Data27092019上执行。

编辑:如果您想使用END (或没有 GNU awk )+您希望 sum 与您传递 Input_files 的顺序相同,请尝试以下操作。

使用END

awk '
BEGIN{
 FS=";"
}
!filename[FILENAME]++{
  a[++count]=FILENAME
}
{
  sum[FILENAME]+=$7
}
END{
  for(i=1;i<=count;i++){
    print "Sum of minute for file: " a[i] " is: " sum[a[i]]
  }
}'  Data26092019 Data27092019


使用ENDFILE

您能否尝试以下,未测试,因为 OP 没有提供样本。 需要 GNU awk

awk 'BEGIN{FS=";"} {sum+=$7} ENDFILE{print "Sum of minute for file: " FILENAME " is: " sum;sum=""}' Data26092019 Data27092019

简单地说,您将执行以下操作:

for file in f1 f2 f3 f4; do
   for time in {10..20}:{00..59}; do 
      sum=$(awk -v t="${time}" -F";" '($0~"^"t){sum+=$7}END{print sum}' "$file"
      echo "$file $sum $time"
   done
done

但是,这非常慢,因为在搜索特定时间键时,您将多次打开每个文件。

我相信你所追求的是:

awk 'function print_summary(    h,m,key) {
        for (h=10;h<=20;++h) {
           for (m=0;m<60;++m) {
              key=sprintf("%0.2d:%0.2d",h,m)
              print fname, sum[key]+0, key
           }
        }
     }
     BEGIN{FS=";"}
     (FNR==1){if(NR>1) print_summary(); delete sum; fname=FILENAME}
     !/^..:..:../{next}
     { key=substr($0,1,5) }
     { sum[key]+=$7 }
     END { print_summary() }' file1 file2 file3 ...

此方法将跳过空文件,但会准确报告预期内容。

其他:

$ awk -F\; '{
    sum[FILENAME]+=$7
} 
END {
    for(f in sum)
        print f,sum[f]
}' file1 file2

Output 带有 2 个样本数据副本:

file1 3
file2 3

使用 gawk,您可以调整@JamesBrown 的答案:

gawk -F\; '{
    sum += $7
} 
ENDFILE {
    print FILENAME, sum
    sum=0
}' file1 file2

非常感谢您的友好回答。 我是新手,我无法理解和评论所有不同的解决方案。 对我帮助最大的是@kvantour 的 function 解决方案。 编码:

awk 'function print_summary(    h,m,key) {
        for (h=10;h<=20;++h) {
           for (m=0;m<60;++m) {
              key=sprintf("%0.2d:%0.2d",h,m)
              print fname, sum[key]+0, key
           }
        }
     }
     BEGIN{FS=";"}
     (FNR==1){if(NR>1) print_summary(); delete sum; fname=FILENAME}
     !/^..:..:../{next}
     { key=substr($0,1,5) }
     { sum[key]+=$7 }
     END { print_summary() }' file1 file2 file3 ...

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM