回答:
awk -F '|' '$1 ~ /smiths/ {sum += $3} END {print sum}' inputfilename
-F
フラグフィールドセパレータを設定します。特殊なシェル文字であるため、単一引用符で囲みます。 $1 ~ /smiths/
、最初のフィールドがregexと一致する行にのみ、次の{code block}を適用します/smiths/
。 ここでは正規表現を使用していないため、特定の値のみを使用しているため、同じように簡単に使用できます。
awk -F '|' '$1 == "smiths" {sum += $3} END {print sum}' inputfilename
文字列の等価性をチェックします。これは/^smiths$/
、別の回答で述べたregexを使用するのと同等です。これには^
、文字列の先頭(フィールド1の先頭)$
のみに一致するアンカーと、文字列の末尾にのみ一致するアンカーが含まれます。正規表現にどれだけ慣れているかわかりません。これらは非常に強力ですが、この場合、文字列の等価性チェックを簡単に使用できます。
unzip -lv /appl/tmp/data.lar | grep documentlibrary | awk '{sum += $1} END {print sum/1024/1024}'
これまでのところ非常に良い。必要なのは、ブロックの前にセレクターを追加して合計を追加することだけです。ここでは、最初の引数に「smith」のみが含まれていることを確認します。
awk 'BEGIN {FS = "|"} ; $1 ~ /^smiths$/ {sum+=$3} END {print sum}'
オプションとしてフィールド区切り文字を指定することにより、これを少し短くすることができます。でawk
、それは一般的に、コマンドラインで変数を初期化することをお勧めします:
awk -F'|' '$1 ~ /^smiths$/ {sum+=$3} END {print sum}'
cat filename.txt | grep smiths | awk -F '|' '{sum+=$NF} END {print sum}'
-F
セパレータを指定するオプション。$NF
「最後の列」用です。cat
grep
ここでは不要です。
/smiths/{...}
、grep呼び出しが存在しない場合に変更する必要があります。これは簡単な変更ですが、実行中のプロセスの数を減らし、エラー制御を簡素化し、コードを明確にするという大きな利点があります。
個人的には、このawk
セクションをできる限りシンプルに保ち、それなしでできる限りのことをすることを好みます。Comingledロジックは、Unixパイプラインのパワーを利用しないため、密接に関連するユースケースの理解、デバッグ、変更が困難です。
cat filename.txt | perl -pe 's{.*|}{}g' | awk '{sum+=$1} END {print sum}'