我有很多文件有三列,格式为:
file1 | file2
1 0 1 | 1 0 2
2 3 3 | 2 3 7
3 6 2 | 3 6 0
4 1 0 | 4 1 3
5 2 4 | 5 2 1
每个文件中前两列相同。我想计算每个文件中3列的总和,以便接收这样的内容:
1 0 3
2 3 10
3 6 2
4 1 3
5 2 5
对于两个文件awk 'FNR==NR { _a[FNR]=$3;} NR!=FNR { $3 += _a[FNR]; print; }' file*
完美地工作(我通过谷歌找到了这个解决方案)。如何在许多文件上更改它?
答案 0 :(得分:3)
您只需要:
awk '{sum[FNR]+=$3} ARGIND==(ARGC-1){print $1, $2, sum[FNR]}' file*
上面使用的GNU awk用于ARGIND。使用其他awk时,只需在开头添加FNR==1{ARGIND++}
。
答案 1 :(得分:1)
由于前两列在每个文件中都相同:
awk 'NR==FNR{b[FNR]=$1 FS $2;}{a[FNR]+=$3}END{for(i=1;i<=length(a);i++){print b[i] FS a[i];}}' file*
数组a
用于获取所有文件的第3列的累积和。
数组b
用于第1和第2列值
最后,我们打印数组a
和b
答案 2 :(得分:1)
<强> 文件1 强>
$ cat f1
1 0 1
2 3 3
3 6 2
4 1 0
5 2 4
<强> file2的 强>
$ cat f2
1 0 2
2 3 7
3 6 0
4 1 3
5 2 1
<强> 输出 强>
$ awk -v start=3 'NF{for(i=1; i<=NF; i++)a[FNR, i] = i>=start ? a[FNR, i]+$i : $i }END{ for(j=1; j<=FNR; j++){ s = ""; for(i=1; i<=NF; i++){ s = (s ? s OFS:"")((j,i) in a ? a[j,i] : "") } print s } }' f1 f2
1 0 3
2 3 10
3 6 2
4 1 3
5 2 5
更好的可读性
变量start
决定从哪一列开始求和,假设你设置为2它将从所有文件中的column2,column3 ......开始求和,依此类推,因为你有相等的字段和行,它运作良好
awk -v start=3 '
NF{
for(i=1; i<=NF; i++)
a[FNR, i] = i>=start ? a[FNR, i]+$i : $i
}
END{
for(j=1; j<=FNR; j++)
{
s = "";
for(i=1; i<=NF; i++)
{
s = (s ? s OFS:"")((j,i) in a ? a[j,i] : "")
}
print s
}
}
' f1 f2