0

以下に示す構造のテキストファイルがあります。それらを1つの列に結合したいと思います(算術的に合計して1つの列として保存します)。

ファイル構造:

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

これは私が取得したいものです:

10
14
18
4

6 に答える 6

6

ほとんどの場合、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ベースのアプローチとほぼ同等です)。

于 2013-09-11T20:04:15.120 に答える
3

@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より一般的で信頼性があります。

于 2013-09-11T20:02:29.870 に答える
2

sed を使用して空白をプラスに置き換えbc、結果を取得します。

sed 's/\s\+/+/g' input | bc
于 2013-09-11T20:02:35.917 に答える
1

Perl で同じことを次に示します (ただし、もっと簡潔にできると確信しています)。

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

ああ、タイトルが要求することを行うには(行ではなくを合計します):

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

なぜなら…パール。

于 2013-09-12T08:00:42.987 に答える