簡體   English   中英

如何使用bash或awk對多個文件中的矩陣求和

[英]how to sum up matrices in multiple files using bash or awk

如果我有任意數量的文件,比如n個文件,並且每個文件都包含一個矩陣,我如何使用bash或awk來總結每個文件中的所有矩陣並獲得輸出?

例如,如果n = 3,我有這3個文件,其中包含以下內容

$ cat mat1.txt

1 2 3
4 5 6
7 8 9

$貓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

有一個簡單的襯墊來做這個嗎?

謝謝!

您可以使用帶paste 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 '{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 "";}}' mat1.txt mat2.txt mat3.txt
  4   5   6 
  7   8   9 
 10  11  12 

這將自動調整為不同大小的矩陣。 我不相信我已經使用過任何GNU功能,所以這應該可以移植到OSX和其他地方。

這個怎么運作:

該命令從每個矩陣的每一行讀取,一次一個矩陣。

  • 對於讀取的每一行,執行以下命令:

     for (i=1;i<=NF;i++) total[FNR","i]+=$i 

    這將循環遍歷該行上的每一列,並將其添加到數組total

    GNU awk具有多維數組,但為了便於攜帶,這里不再使用它們。 awk的數組是關聯的,它通過將它們與逗號組合在一起,從文件的行號, FNR和列號i創建索引。 結果應該是可移植的。

  • 讀取所有矩陣后,將total打印結果:

     END{for (j=1;j<=FNR;j++) {for (i=1;i<=NF;i++) printf "%3i ",total[j","i]; print ""}} 

    在這里, j遍歷每一行直到總行數FNR 然后i循環遍歷每列,直到總列數NF 對於每行和每列,通過printf "%3i ",total[j","i]打印printf "%3i ",total[j","i] 這會將總計打印為3個字符寬的整數。 如果數字是浮動的或更大的,請相應地調整格式。

    在每行的末尾, print ""語句導致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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM