列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
回答
と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
テキスト処理用のツールであるawk言語では、$1
最初の列の値を$2
表し、2番目の列の値を表し$3
、3番目などをNF
表します。特別なものは、最後の列IDを表し、それに応じ$NF
て最後の列の値になります(置換できます)。$2
上記$NF
も同様です;そして、はいNF
、最後の列IDがいつであるかをキャッチするので、変数の値は、列の数を示します(各行awkの値の更新は入力から読み取られます))。
入力ファイルが空でありながら数値出力を取得するエッジケースを処理するために、結果に0を追加して、awk
数値結果を強制的に出力します。
列(またはフィールド)awk
で区別FS
変数(Fはeild Sの使用スペース/タブであるデフォルトeparatorを)。別の文字で列を分割する-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
少し複雑になり、次のサンプルで入力ファイルのN列すべてを合計します。
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
それはDCにとって良い仕事です。
dcは、最初にfold.txtからデータを読み取り、その後にsum_col_dcからコードを読み取ります。
そのように使用してください:dc fold.txt sum_col_dc
cat sum_col_dc
[lB+sBlA+sAz0<C]sC[lGLElDnnnp]sH[Total count Column ]sD[B]sE[A]SE[ = ]sGlCxlAlHxlBlHx
もう少し詳しく説明します。
[lB+sBlA+sAz0<C]sC
[lGLElDnnnp]sH
[Total count Column ]sD
[B]sE
[A]SE
[ = ]sG
lCx
lA
lHx
lB
lHx
DCをお楽しみください
オンデマンドでさらに説明します。