ファイルの6行目ごとに5行目の値を合計します。

ファイルの6行目ごとに5行目の値を合計します。

次のテキストブロックを含むtxtファイルがあります。

17-01-2023
Purchase AAA
Apple Pay John Doe
Full Payment
-11,34€
0,11€
30-01-2023
Purchase BBB
Mastercard Jane Doe
Installment
-23,90€
0,24€

したがって、日付、購入タイプ、支払いタイプと名前、支払いタイプ、負の値、割引が順番に表示されます。

これは、何千ものエントリを含むファイルで繰り返されます。

値の合計(この場合は11,34 + 23,90)を取得し、その合計を正数にしたいと思います。数字の後にユーロ記号があり、私のロケールでは、カンマが小数点区切り記号であることを覚えておいてください。

sed、awkなどを使用して端末でこれを行うにはどうすればよいですか?

ベストアンサー1

awkを使用できます。数字以外の通貨記号接頭辞(たとえば)がある場合とは異なり、€-23,90数値変換中に数字以外の接尾辞は無視されます。実装によっては、ロケールの小数点区切り文字を異なる方法で処理できます。

mawk 'NR%6 == 5 {sum -= $0} END {print sum}' file

尊重LC_NUMERIC/LC_ALL要求に従ってPOSIX準拠、GNU awkはデフォルトでPOSIX仕様から離れていますが、ロケールを使用するように指示する必要があります。

gawk --use-lc-numeric 'NR%6 == 5 {sum -= $0} END {print sum}' file

GNU Awkユーザーガイドを参照してください。ロケールは変換に影響します


たとえば、de_DE.UTF-8ロケールを使用してテストします。

$ export LC_NUMERIC=de_DE.UTF-8
$ 
$ mawk 'NR%6 == 5 {sum -= $0} END {print sum}' yourfile
35,24
$ 
$ gawk --use-lc-numeric 'NR%6 == 5 {sum -= $0} END {print sum}' sum=x yourfile
35,24

Mac OSの場合:

$ awk --version
awk version 20200816

$ export LC_NUMERIC=de_DE.UTF-8

$ awk 'NR%6 == 5 {sum -= $0} END {print sum}' yourfile
35,24

おすすめ記事