簡體   English   中英

如何在Bash中聯接(求和)列

[英]How to join (sum) columns in Bash

我有一個文本文件,其結構如下所示。 我想將它們合並為一列(對它們進行算術求和並另存為一列)。

文件結構:

1   4   1   4
2   5   2   5
3   6   3   6

這就是我想要得到的:

10
14
18

對於大多數目的,我認為最好使用外部程序,例如AWK或Perl(有關AWK方法,請參閱cnicutar的答案); 但如果您願意,可以按以下步驟在純Bash中執行此操作:

while read -a arr ; do
    i=0
    for field in ${arr[*]} ; do
        (( i += field ))
    done
    echo $i
done < input-file.txt > output-file.txt

或者更簡潔-但也更hacky-您可以編寫:

while read ; do
    echo $(( ${REPLY//$'\t'/+} ))
done < input-file.txt > output-file.txt

(后者大致等效於(各種)基於sed的各種其他答案的方法)。

這個怎么樣:

awk '{ x=0; for(i = 1; i <= NF; i++) x += $i; print x }' file

@cnicutar提供了一個標准的awk解決方案,我只是添加了一個sed單線(帶有bc)來取樂:

kent$  cat f
1 4 1 4
2 5 2 5
3 6 3 6

kent$  sed 's/ \+/+/g' f|bc
10
14
18

sed行中的\\+只是為了防止您的列被多個空格分隔。

正如@ruakh所建議的那樣, sed 's/[[:space:]]\\+/+/g' f|bc g'f sed 's/[[:space:]]\\+/+/g' f|bc更通用,更可靠。

使用sed用加號替換空格,然后使用bc獲得結果:

sed 's/\s\+/+/g' input | bc

另一種選擇(awk解決方案更好,但也很高興知道有替代方法:))

sed 's/ /+/g' test.txt | sed -E 's/^(.*)$/echo $((\1))/' | bash

這與Perl中的情況相同(盡管我可以肯定它可以做得更簡潔):

perl -nle '$s=0; $s+=$_ for split; print $s'

哦,要做你的標題所要求的( 總和而不是行總和):

perl -nle '$i=0; $s[$i++]+=$_ for split; END { print "@s" }'

因為……Perl。

暫無
暫無

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

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