【发布时间】:2016-10-21 15:36:38
【问题描述】:
我编写了一个 AWK 脚本,它读取文件并将行与列相乘并将它们相加。我想一次将多个文件(任意数量的文件)作为参数传递给 awk 脚本,例如A.txt、B.txt、C.txt。我希望 AWK 脚本给我行和列的总和。我总是想跳过每个文本文件的前 5 列。
每个文本文件可以有任意数量的列。一个文件夹内可以有多个文本文件。
我想运行:
awk -f foo.awk A.txt B.txt C.txt
例如
如果有 3 个不同的文件 A.txt、B.txt、C.txt,将每 3 个文件的行和列相乘相加。
输出应该是:
No of columns in A.txt: count of columns in A.txt with first 5 columns ignored
No of columns in B.txt: count of columns in B.txt with first 5 columns ignored
No of columns in C.txt: count of columns in C.txt with first 5 columns ignored
Sum of A.txt: rows in A.txt*columns in A.txt
Sum of B.txt: rows in B.txt*columns in B.txt
Sum of C.txt: rows in C.txt*columns in C.txt
Total Sum: A+B+C
以下是(某种伪代码)到目前为止我对 foo.awk 的了解(它不适用于多个文件):
#!/bin/gawk -f
BEGIN { rows=0; columns=0 }
{
FS="\t";
if(/^#COLS/) {
column=NF-5; #skip first 5 columns
columns+=column
}
if (!/^#/){
rows++;
files[FILENAME]++;
}
}
END {
for (fname in files) {
printf ("%'24d rows in %s\n",files[fname],fname);
}
printf("No of columns in A.txt= %'d\n", columnsA);
printf("No of columns in B.txt= %'d\n", columnsB);
printf("No of columns in C.txt= %'d\n", columnsC);
sum=columns*rows; # multiply no of rows by column in each file and add them up
printf( "Sum of A.txt %d\n", sumA);
printf( "Sum of B.txt %d\n", sumB);
printf( "Sum of C.txt %d\n", sumC);
printf( "Total sum is %d\n", sum_of_A+B+C);
}
例如
A.txt:
#ignore this line -- pattern does not match
#ignore this line -- pattern does not match
#COLS A B C D E F G H I
row1 1 2 3 4 5 6 7 8 9
row2 1 3 3 4 5 6 7 8 9
row3 1 3 3 4 5 6 7 8 9
B.txt:
#ignore this line -- pattern does not match
#ignore this line -- pattern does not match
#COLS A B C D E F G H
row1 1 2 3 4 5 6 7 8
row2 5 3 3 4 6 6 7 8
row3 8 3 3 4 5 6 7 8
C.txt:
#ignore this line -- pattern does not match
#ignore this line -- pattern does not match
#COLS A B C D E F G H I J
row1 1 2 3 3 5 6 7 8 9 2
row2 7 3 3 4 5 6 7 8 9 7
row3 9 3 3 4 5 6 7 8 9 6
row4 9 3 3 4 5 6 7 8 9 6
output:
No of columns in A.txt: 5
No of columns in B.txt: 4
No of columns in C.txt: 6
Sum of A.txt: 3*5=15
Sum of B.txt: 3*4=12
Sum of C.txt: 4*6=24
Total Sum: 12+9+20 = 51
谢谢。
【问题讨论】:
-
对 awk 不是很熟悉,但我认为您需要使用文件构造 BEGINFILE 和 ENDFILE,这可能是 gawk 特定的...
-
@Sundeep 这是 gawk 特定的,请参阅 manual - 但如果 gawk 可用,IMO 是最好的解决方案。
-
@BenjaminW。感谢您的澄清.. 刚刚注意到 OP 使用了
#!/bin/gawk -f -
请提供几个示例文件和预期的输出。这太令人困惑了。
-
已更新示例,谢谢