1

ファイルにコンテンツがあります

お気に入り

asdfb ... 1
adfsdf ... 2
sdfdf ..   3

1 + 2 + 3 を加算して結果を 6 にする UNIX コマンドを書きたい

grep と awk が便利だと私が認識していることから、ポインタがあれば役立ちます。

4

4 に答える 4

4

以下はあなたが探しているものだと思います。stdinから読み取られたデータの各レコードの最後のフィールドを合計します。

awk '{ sum += $NF } END { print sum }' < file.txt

注意すべき点:

  1. awkを使用すると、変数を宣言する必要はありません。変数に値を割り当てることで、変数が存在するようになります。
  2. 変数NFは、現在のレコードのフィールド数です。$を前に付けることで、その値を変数として扱います。少なくともこれはとにかく動作するように見える方法です:)
  3. END { }ブロックは、すべてのレコードが他のブロックによって処理された後にのみ実行されます。
于 2009-05-10T05:40:34.573 に答える
1

言語の一部として機能が組み込まれawkているため、必要なのはスクリプトだけです。grep

実際のファイルが次のもので構成されているとしましょう。

asdfb zz 1
adfsdf yyy 2
sdfdf xx   3

3 番目の列を合計します。以下を使用できます。

echo 'asdfb zz 1
adfsdf yyy 2
sdfdf xx   3' | awk '
    BEGIN {s=0;}
          {s = s + $3;}
    END   {print s;}'

BEGIN 句は行を処理する前に実行され、END 句はすべての行を処理した後に実行されます。

grep他の句はすべての行で発生しますが、さらに句を追加して、あらゆる種類のもの ( -py のもの)に基づいて動作を変更できます。

于 2009-05-10T05:36:10.153 に答える
0

これがPerlのものです。

$ cat foo.txt
asdfb ... 1
adfsdf ... 2
sdfdf ..   3

$ perl -a -n -E '$total += $F[2]; END { say $total }' foo
6

ゴルフバージョン:

perl -anE'END{say$n}$n+=$F[2]' foo
6
于 2009-05-10T05:49:18.937 に答える
0

これはまさにあなたが探しているものではないかもしれませんが、目標を達成するための簡単な Ruby スクリプトを書きました。

#!/usr/bin/env ruby

total = 0
while gets
    total += $1.to_i if $_ =~ /([0-9]+)$/
end
puts total
于 2009-05-10T05:35:56.287 に答える