![](/img/trans.png)
[英]one liner in bash (using perl or awk) to change extension of multiple files?
[英]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.