GNU/Linux >> Linux の 問題 >  >> Linux

awk を使用して、別の列の値に基づいて列の値を合計する

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}'

Linux
  1. Duコマンドで–excludeを使用しますか?

  2. 列値条件で awk を使用する

  3. 最初の列のデータを検索するgrep

  1. grep と awk の使用

  2. ファイルの 5 番目の列の値に基づいて .CSV ファイルをフィルター処理し、それらのレコードを新しいファイルに出力します。

  3. 特定の列の内容を awk に置き換える方法は?

  1. Linuxでprocファイルシステムを使用してトラブルシューティングする

  2. 別のサーバーを使用してサーバーにSSH接続する方法は??

  3. 他の列の変数に基づいて列の値の合計を個別に取得するにはどうすればよいですか?