[英]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.