A列とB列にスペースで区切られた値のリストを追加し、合計を表示します。

A列とB列にスペースで区切られた値のリストを追加し、合計を表示します。

というファイルがあります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最初の列の値を表示し、$22番目の列の値を表示し、$33番目の列などを表示します。特別なツールNFは、最後の列のIDを表示することです。最後の列の値(したがって、上記の内容も次のように置き換えることができます。$NFはい、最後の列IDのときにキャプチャするため、変数の値は列の数を示します(各行の値の更新awk入力から読み取られます)。$2$NFNF

入力ファイルは空ですが、それでも数値出力を取得する極端なケースを処理するために、結果にゼロを追加してawk数値結果を強制します。

列(またはフィールド)awkは変数FSFイルド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

おすすめ記事