を使用して列のいくつかの数値を合計しようとしています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
「最後の列」に使用されます。