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


63

を使用して列の特定の数値を合計しようとしていますawk。「スミス」の列3のみを合計して合計212を取得しawkます。「スミス」だけでなく、「スミス」を使用して列全体を合計できます。私は持っています:

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

回答:


81
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の先頭)$のみに一致するアンカーと、文字列の末尾にのみ一致するアンカーが含まれます。正規表現にどれだけ慣れているかわかりません。これらは非常に強力ですが、この場合、文字列の等価性チェックを簡単に使用できます。


3
ところで、私のお気に入りのawkリファレンスはgrymoire.com/Unix/Awk.htmlです。非常に役立つページ。
ワイルドカード

1
ありがとう@Wildcard!あなたのアドバイスに基づいて、大きなzipアーカイブ内の特定のファイルの非圧縮サイズをきれいに集約することができました:) unzip -lv /appl/tmp/data.lar | grep documentlibrary | awk '{sum += $1} END {print sum/1024/1024}'
パウエル

15

別のアプローチは、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

これが正しい答えです
-PoVa

5

これまでのところ非常に良い。必要なのは、ブロックの前にセレクターを追加して合計を追加することだけです。ここでは、最初の引数に「smith」のみが含まれていることを確認します。

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

オプションとしてフィールド区切り文字を指定することにより、これを少し短くすることができます。でawk、それは一般的に、コマンドラインで変数を初期化することをお勧めします:

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

0
cat filename.txt | grep smiths | awk -F '|' '{sum+=$NF} END {print sum}'
  • -F セパレータを指定するオプション。
  • $NF 「最後の列」用です。

1
catgrepここでは不要です。
アンドレイ

なぜgrepは@Andreyが不要なのですか?OPは「スミス」行のみを追加したいと考えています。awkステートメントを変更する必要がありますよね?
EL

1
@ELはい、awkステートメントは/smiths/{...}、grep呼び出しが存在しない場合に変更する必要があります。これは簡単な変更ですが、実行中のプロセスの数を減らし、エラー制御を簡素化し、コードを明確にするという大きな利点があります。
アンドレイ

0

個人的には、このawkセクションをできる限りシンプルに保ち、それなしでできる限りのことをすることを好みます。Comingledロジックは、Unixパイプラインのパワーを利用しないため、密接に関連するユースケースの理解、デバッグ、変更が困難です。

cat filename.txt | perl -pe 's{.*|}{}g' | awk '{sum+=$1} END {print sum}'
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.