列Aと列Bの値のリストをスペースで区切って追加し、合計結果を表示します[重複]

Dec 29 2020

というファイルがあります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

回答

5 αғsнιη Dec 29 2020 at 00:00

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
ctac_ Dec 30 2020 at 01:56

それは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をお楽しみください
オンデマンドでさらに説明します。