awk -F '|' '$1 ~ /smiths/ {sum += $3} END {print sum}' inputfilename
-F
flag はフィールドセパレータを設定します。これは特殊なシェル文字であるため、単一引用符で囲みます。- 次に
$1 ~ /smiths/
最初のフィールドが正規表現/smiths/
に一致する行にのみ、次の {code block} を適用します . - 残りはコードと同じです。
ここでは実際には正規表現を使用しているのではなく、特定の値だけを使用しているため、次のように簡単に使用できることに注意してください。
awk -F '|' '$1 == "smiths" {sum += $3} END {print sum}' inputfilename
文字列の等価性をチェックします。これは、正規表現 /^smiths$/
を使用することと同等です ^
を含む別の回答で述べたように 文字列の先頭 (フィールド 1 の先頭) と $
のみに一致するアンカー 文字列の末尾のみに一致するようにアンカーします。正規表現にどれだけ精通しているかわかりません。これらは非常に強力ですが、この場合、文字列等価チェックを同じように簡単に使用できます。
別のアプローチは、awk 連想配列を使用することです。詳細については、こちらをご覧ください。この行は目的の出力を生成します:
awk -F '|' '{a[$1] += $3} END{print a["smiths"]}' filename.txt
副作用として、配列には他のすべての値が格納されます:
awk -F '|' '{a[$1] += $3} END{for (i in a) print i, a[i]}' filename.txt
出力:
smiths 212
denniss 100
olivert 10
これまでのところ非常に良い。ブロックの前にセレクターを追加して合計を追加するだけです。ここで、最初の引数に「smiths」のみが含まれていることを確認します:
awk 'BEGIN {FS = "|"} ; $1 ~ /^smiths$/ {sum+=$3} END {print sum}'
フィールドセパレーターをオプションとして指定することで、これを少し短縮できます。 awk
で 通常、コマンド ラインで変数を初期化することをお勧めします:
awk -F'|' '$1 ~ /^smiths$/ {sum+=$3} END {print sum}'