以下に示す構造のテキストファイルがあります。それらを1つの列に結合したいと思います(算術的に合計して1つの列として保存します)。
ファイル構造:
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
または、もっと簡潔に (ただし、よりハック的にも)、次のように書くことができます。
while read ; do
echo $(( ${REPLY//$'\t'/+} ))
done < input-file.txt > output-file.txt
(後者は、他のさまざまな回答の(これもハックな)sedベースのアプローチとほぼ同等です)。
@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
in sed 行は、\+
列がマルチスペースで区切られている場合に備えてあります。
@ruakhが示唆したように、 sed 's/[[:space:]]\+/+/g' f|bc
より一般的で信頼性があります。
sed を使用して空白をプラスに置き換えbc
、結果を取得します。
sed 's/\s\+/+/g' input | bc
Perl で同じことを次に示します (ただし、もっと簡潔にできると確信しています)。
perl -nle '$s=0; $s+=$_ for split; print $s'
ああ、タイトルが要求することを行うには(行ではなく列を合計します):
perl -nle '$i=0; $s[$i++]+=$_ for split; END { print "@s" }'
なぜなら…パール。