Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用bash或awk汇总多个文件中的矩阵_Bash_Awk - Fatal编程技术网

如何使用bash或awk汇总多个文件中的矩阵

如何使用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 有没有一个简单的单行

如果我有任意数量的文件,比如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
有没有一个简单的单行程序来实现这一点


谢谢

您可以将
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