awk を使用した他の列の値に基づく列の値の合計

awk を使用した他の列の値に基づく列の値の合計

を使用して列のいくつかの数値を合計しようとしていますawk。 「smiths」の3列だけを合計して合計212個を得たいと思います。awk「smiths」だけを使用するのではなく、列全体を合計することができます。私は持っています:

awk 'BEGIN {FS = "|"} ; {sum+=$3} END {print sum}' filename.txt

私もパテを使用しています。助けてくれてありがとう。

smiths|Login|2
olivert|Login|10
denniss|Payroll|100
smiths|Time|200
smiths|Logout|10

答え1

awk -F '|' '$1 ~ /smiths/ {sum += $3} END {print sum}' inputfilename
  • フラグは-Fフィールド区切り文字を設定します。特殊なシェル文字なので、一重引用符で囲みました。
  • 次に、$1 ~ /smiths/最初のフィールドが正規表現に一致する行にのみ、次の{code block}を適用します/smiths/
  • 残りはコードと同じです。

ここでは実際に正規表現を使用せず、特定の値のみを使用するため、次のように簡単に使用できます。

awk -F '|' '$1 == "smiths" {sum += $3} END {print sum}' inputfilename

文字列同等性を確認してください。これは、文字列の先頭(フィールド1の先頭)にのみ一致するアンカーと、文字列の最後にのみ一致するアンカーを/^smiths$/含む他の答えで述べたように、regexを使用するのと同じです。正規表現にどれくらい慣れているかよくわかりません。これは非常に強力ですが、この場合、文字列同等チェックを簡単に使用できます。^$

答え2

別の方法は、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

答え3

今まではそんなに良くなった。合計を追加するには、ブロックの前にセレクタを追加するだけです。ここでは、最初のパラメータに「smiths」のみが含まれていることを確認します。

awk 'BEGIN {FS = "|"} ; $1 ~ /^smiths$/ {sum+=$3} END {print sum}'

フィールド区切り文字をオプションとして指定すると、このプロセスを短縮できます。awk通常、コマンドラインで変数を初期化することをお勧めします。

awk -F'|' '$1 ~ /^smiths$/ {sum+=$3} END {print sum}'

答え4

cat filename.txt | grep smiths | awk -F '|' '{sum+=$NF} END {print sum}'
  • -F区切り文字を指定するオプションです。
  • $NF「最後の列」に使用されます。

関連情報