如何在多个文件上使用 awk?
How to use awk on multiple files?
我正在使用 Linux。我写了一些看起来像这样的代码:
for x in {10..20}:{00..59}; do awk -F';' '/'"$x"'/ {y+=} 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
...
输出示例:
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+=} END {print y}' Data26092019; done
它必须在 Data26092019
和 Data27092019
上执行。
编辑: 如果您想使用 END
(或者没有 GNU awk
) + 你希望总和的顺序与传递的顺序相同 Input_files 然后尝试以下。
使用END
:
awk '
BEGIN{
FS=";"
}
!filename[FILENAME]++{
a[++count]=FILENAME
}
{
sum[FILENAME]+=
}
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+=} ENDFILE{print "Sum of minute for file: " FILENAME " is: " sum;sum=""}' Data26092019 Data27092019
另一个:
$ awk -F\; '{
sum[FILENAME]+=
}
END {
for(f in sum)
print f,sum[f]
}' file1 file2
包含 2 个样本数据副本的输出:
file1 3
file2 3
使用 gawk,您可以修改@JamesBrown 的回答:
gawk -F\; '{
sum +=
}
ENDFILE {
print FILENAME, sum
sum=0
}' file1 file2
简单地说,您可以执行以下操作:
for file in f1 f2 f3 f4; do
for time in {10..20}:{00..59}; do
sum=$(awk -v t="${time}" -F";" '([=10=]~"^"t){sum+=}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([=11=],1,5) }
{ sum[key]+= }
END { print_summary() }' file1 file2 file3 ...
此方法将跳过空文件,但会准确报告预期内容。
非常感谢您的热心回答。我是新手,我无法理解和评论所有不同的解决方案。对我最有帮助的是
来自@kvantour 的功能解决方案。代码:
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([=10=],1,5) }
{ sum[key]+= }
END { print_summary() }' file1 file2 file3 ...
我正在使用 Linux。我写了一些看起来像这样的代码:
for x in {10..20}:{00..59}; do awk -F';' '/'"$x"'/ {y+=} 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
...
输出示例:
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+=} END {print y}' Data26092019; done
它必须在 Data26092019
和 Data27092019
上执行。
编辑: 如果您想使用 END
(或者没有 GNU awk
) + 你希望总和的顺序与传递的顺序相同 Input_files 然后尝试以下。
使用END
:
awk '
BEGIN{
FS=";"
}
!filename[FILENAME]++{
a[++count]=FILENAME
}
{
sum[FILENAME]+=
}
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+=} ENDFILE{print "Sum of minute for file: " FILENAME " is: " sum;sum=""}' Data26092019 Data27092019
另一个:
$ awk -F\; '{
sum[FILENAME]+=
}
END {
for(f in sum)
print f,sum[f]
}' file1 file2
包含 2 个样本数据副本的输出:
file1 3
file2 3
使用 gawk,您可以修改@JamesBrown 的回答:
gawk -F\; '{
sum +=
}
ENDFILE {
print FILENAME, sum
sum=0
}' file1 file2
简单地说,您可以执行以下操作:
for file in f1 f2 f3 f4; do
for time in {10..20}:{00..59}; do
sum=$(awk -v t="${time}" -F";" '([=10=]~"^"t){sum+=}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([=11=],1,5) }
{ sum[key]+= }
END { print_summary() }' file1 file2 file3 ...
此方法将跳过空文件,但会准确报告预期内容。
非常感谢您的热心回答。我是新手,我无法理解和评论所有不同的解决方案。对我最有帮助的是 来自@kvantour 的功能解决方案。代码:
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([=10=],1,5) }
{ sum[key]+= }
END { print_summary() }' file1 file2 file3 ...