如何使用bash或awk汇总多个文件中的矩阵
如果我有任意数量的文件,比如n个文件,并且每个文件都包含一个矩阵,那么如何使用bash或awk汇总每个文件中的所有矩阵并获得输出 例如,如果n=3,我有这3个文件,其中包含以下内容 $cat mat1.txt如何使用bash或awk汇总多个文件中的矩阵,bash,awk,Bash,Awk,如果我有任意数量的文件,比如n个文件,并且每个文件都包含一个矩阵,那么如何使用bash或awk汇总每个文件中的所有矩阵并获得输出 例如,如果n=3,我有这3个文件,其中包含以下内容 $cat mat1.txt 1 2 3 4 5 6 7 8 9 $cat mat2.txt 1 1 1 1 1 1 1 1 1 $cat mat3.txt 2 2 2 2 2 2 2 2 2 我希望获得以下输出: $cat output.txt 4 5 6 7 8 9 10 11 12 有没有一个简单的单行
1 2 3
4 5 6
7 8 9
$cat mat2.txt
1 1 1
1 1 1
1 1 1
$cat mat3.txt
2 2 2
2 2 2
2 2 2
我希望获得以下输出:
$cat output.txt
4 5 6
7 8 9
10 11 12
有没有一个简单的单行程序来实现这一点
谢谢 您可以将
awk
与粘贴一起使用:
awk -v n=3 '{for (i=1; i<=n; i++) printf "%s%s", ($i + $(i+n) + $(i+n*2)),
(i==n)?ORS:OFS}' <(paste mat{1,2,3}.txt)
4 5 6
7 8 9
10 11 12
awk-vn=3'{for(i=1;i
这里,j
在每一行上循环到总行数,FNR
。然后i
在每一列上循环到总列数,NF
。对于每一行和每一列,通过printf“%3i”,total[j”,“i]打印总行数
。这会将总数打印为3个字符宽的整数。如果数字是浮点或更大,请相应调整格式
在每行的末尾,print”“
语句会导致打印换行符
GNU awk具有多维阵列
gawk '
{
for (i=1; i<=NF; i++)
m[i][FNR] += $i
}
END {
for (y=1; y<=FNR; y++) {
for (x=1; x<=NF; x++)
printf "%d ", m[x][y]
print ""
}
}
' mat{1,2,3}.txt
gawk'
{
对于(i=1;禁止使用粘贴。您可能希望将-v n=3
传递给awk@anubhava粘贴的巧妙使用。我很好奇你为什么使用awk@gboffi:我真的很感兴趣你为什么喜欢进程替换而不是管道。无论如何谢谢你。@gboffi:主要是性能原因,在mat*.txt
结尾更简洁,对我也有效。
for (i=1;i<=NF;i++) total[FNR","i]+=$i
END{for (j=1;j<=FNR;j++) {for (i=1;i<=NF;i++) printf "%3i ",total[j","i]; print ""}}
gawk '
{
for (i=1; i<=NF; i++)
m[i][FNR] += $i
}
END {
for (y=1; y<=FNR; y++) {
for (x=1; x<=NF; x++)
printf "%d ", m[x][y]
print ""
}
}
' mat{1,2,3}.txt