ファイルにコンテンツがあります
お気に入り
asdfb ... 1
adfsdf ... 2
sdfdf .. 3
1 + 2 + 3 を加算して結果を 6 にする UNIX コマンドを書きたい
grep と awk が便利だと私が認識していることから、ポインタがあれば役立ちます。
以下はあなたが探しているものだと思います。stdinから読み取られたデータの各レコードの最後のフィールドを合計します。
awk '{ sum += $NF } END { print sum }' < file.txt
注意すべき点:
NF
は、現在のレコードのフィールド数です。$を前に付けることで、その値を変数として扱います。少なくともこれはとにかく動作するように見える方法です:)END { }
ブロックは、すべてのレコードが他のブロックによって処理された後にのみ実行されます。言語の一部として機能が組み込まれ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 のもの)に基づいて動作を変更できます。
これが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
これはまさにあなたが探しているものではないかもしれませんが、目標を達成するための簡単な Ruby スクリプトを書きました。
#!/usr/bin/env ruby
total = 0
while gets
total += $1.to_i if $_ =~ /([0-9]+)$/
end
puts total