次のテキストブロックを含む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