というファイルがありますfold.txt
。各行には、スペースで区切られた2つの値があります。最初の値が列Aを表し、スペースの後ろの2番目の値が列Bを表す場合、列Aのすべての値と列Bのすべての値を加算し、各列の合計を別々に表示します。 ?
私は次のことを期待しています:
$ cat fold.txt
100 500
200 300
700 100
出力:
Total count Column A = 1000
Total count column B = 900
ベストアンサー1
そしてawk
:
awk '{ sum_A +=$1; sum_B+=$2; };
END{ print "Total count Column A = " sum_A +0;
print "Total count column B = " sum_B +0;
}' infile
存在するアッ言語はテキスト処理目的のためのツールで、$1
最初の列の値を表示し、$2
2番目の列の値を表示し、$3
3番目の列などを表示します。特別なツールNF
は、最後の列のIDを表示することです。最後の列の値(したがって、上記の内容も次のように置き換えることができます。$NF
はい、最後の列IDのときにキャプチャするため、変数の値は列の数を示します(各行の値の更新awk入力から読み取られます)。$2
$NF
NF
入力ファイルは空ですが、それでも数値出力を取得する極端なケースを処理するために、結果にゼロを追加してawk
数値結果を強制します。
列(またはフィールド)awk
は変数FS
(FイルドS区切り文字)、デフォルトではスペース/タブを使用します。列を別の文字に分割するには、-F
次のオプションを使用して上書きできます。awk
awk -F'<character-here>' '...' infile
または、BEGIN{...}
次のブロック内でFS
:
awk 'BEGIN{ FS="<character-here>"; }; { ... }' infile
たとえば、次のような入力ファイルの場合(スペースではなくカンマ):
100,500
200,300
700,100
awk
次のようにコードを書くことができます。
awk -F',' '{ sum_A +=$1; sum_B+=$2; };
END{ print "Total count Column A = " sum_A +0;
print "Total count column B = " sum_B +0;
}' infile
またはBEGIN
ブロック内で:
awk 'BEGIN{ FS=","; }; { sum_A +=$1; sum_B+=$2; };
END{ print "Total count Column A = " sum_A +0;
print "Total count column B = " sum_B +0;
}' infile
少し複雑でまとめると窒素次の例の入力ファイル列は次のとおりです。
100,500,140,400
200,300,640,200
700,100,400,130
したがって、最初の段落で説明しましたNF
(NF値は、行ごとに更新される列の数を示します)。
awk -F',' '{ for (i=1; i<=NF; i++) sum[i]+=$i; };
END{ for (colId in sum) {
printf ("Total count Column: %d= %d\n", colId, sum[colId] );
};
}' infile
ここで唯一の新しい点は、awk
同じ列IDを処理するために配列を使用し、その配列から値を取得し、その配列にその値を追加するi
ことです$i
(この配列のインデックス/キーは列IDです)。END{...}
ブロックに表示されているキーの配列を繰り返し、最初に列IDを印刷してからその横にある列の合計を印刷すると、次の出力が表示されます。
Total count Column: 1= 1000
Total count Column: 2= 900
Total count Column: 3= 1180
Total count Column: 4= 730