2番目の列に基づいて最初の列の合計を取得します。

2番目の列に基づいて最初の列の合計を取得します。

私はファイル内のレコード数(行数)とディレクトリ内のファイル名をoutput.txtファイルに保存するBashスクリプトを作成しました。

出力 .txt ファイルは次のようになります。

No.ofRecord    FileName                   delimiter
563394         1--UnixfileName.txt        28
364794         2--UnixfileName.txt        28
785895         3--UnixfileName.txt        28
99778453       1--NextUnixFileName.txt    18
95645453       2--NextUnixFileName.txt    18
99745313       3--NextUnixFileName.txt    18

希望する結果

出力.txt

No.ofRecord    FileName                   delimiter
563394         1--UnixfileName.txt        28
364794         2--UnixfileName.txt        28
785895         3--UnixfileName.txt        28
99778453       1--NextUnixFileName.txt    18
95645453       2--NextUnixFileName.txt    18
99745313       3--NextUnixFileName.txt    18

TOTAL :
1714083  UnixfileName
295169219 NextUnixFileName

メモ:

ファイル名がUnixFileNameに似ている場合は、No.ofRecordを合計します。

ファイル名がNextUnixFileNameに似ている場合、No.ofRecordが合計されます。

よろしくお願いします。

答え1

$ awk 'NR > 1 { k = substr($2, 4); cnt[k] += $1 } { print } END { print "\nTOTAL:"; for (k in cnt) print cnt[k], k }' file
No.ofRecord    FileName                   delimiter
563394         1--UnixfileName.txt        28
364794         2--UnixfileName.txt        28
785895         3--UnixfileName.txt        28
99778453       1--NextUnixFileName.txt    18
95645453       2--NextUnixFileName.txt    18
99745313       3--NextUnixFileName.txt    18

TOTAL:
1714083 UnixfileName.txt
295169219 NextUnixFileName.txt

スクリプトは、4番目の文字で始まるキーにawk基づいて最初の列をk2番目の列に合計します。これは、最初の行(ヘッダー)を除くファイルのすべての入力行で行われます。すべての入力ラインは、変更されずに出力に渡されます。

最後に、見つかった各キーの総数を印刷します。

合計の列幅を残りのデータと同じにするには、最後の列をprint cnt[k], k次の形式に変更できます。

printf("%-15d%s\n", cnt[k], k)

数値を左揃えの 15 文字幅の整数にフォーマットします。

関連情報