2016-05-04 18 views
1

各行のすべての3番目のフィールドを追加して結果を生成します。以下は特定の列にすべての値を追加するにはどうすればよいですか?

私は問題

sum=0 
grep '2016Feb' input.txt|awk -F\- '{print $3}'|while read LINE; do 
sum = $(expr $sum + $LINE) 
done 
echo $sum 

を解く方法である私のコードよりも問題を解決するための良い方法はありますか? @コマンドライン自体の問題を解決するコマンドは可能でしょうか?以下のようなファイルの場合

$ cat input.txt 
Feb2016-2016-110 
Feb2016-2016-20 
Feb2016-2016-220 
Feb2016-2016-140 
Feb2016-2016-100 

出力は次のようになります。590

+0

合計= $(exprのの$和+ $のLINE)は '有効な構文ではありません'ので、私は、これが機能している疑い。 '='の周りのスペースは削除する必要があります。 – fedorqui

+0

合意されたfedorqui。上記のコードは実装されていません。しかし、それが解決される論理と方法は、構文の修正を除外しても間違いなく正しいです。 – user3624000

答えて

2

ちょうどダッシュにフィールドセパレータを設定し、3列目合計:あなただけのテキスト「Feb2016」を含むこれらの行を数えているように見えるので

$ awk -F- '{sum+=$3} END{print sum+0}' file 
590        ^^ 
#      in case there are no matching lines, print 0 

を、あなたはまた、フィルタを追加することができます。

awk -F- '/Feb2016/{sum+=$3} END{print sum+0}' file 
#  ^^^^^^^^^ 
#  just on lines containing the string "Feb2016" 
+1

これは有効です。 Fedorquiに感謝します。 – user3624000

1
$ cat data 
Feb2016-2016-110 
Feb2016-2016-20 
Feb2016-2016-220 
Feb2016-2016-140 
Feb2016-2016-100 
$ cut -d - -f 3 data | paste -s -d '+' | bc 
590 
$ 
+0

awkだけで処理できるのはなぜですか? – fedorqui

+1

@fedorquiはいtrue、パイプラインの上に3つのプロセスが生成されます。私は 'awk'バージョンを投稿しようとしていましたが、あなたは数秒で私を打ち負かしました..ちょうど別のバージョンを投稿しました – ritesht93

+0

その場合、' cut'はもっと軽量になります。 –