不同列中带逗号的值求和

不同列中带逗号的值求和

我的输入文件是这样的:

x;y;z
1;1,2;1
0;0,5;1
0;0,75;2
4;1,5;2
2;3,55;1

我的awk是:'{if($1>0){print $1";"$2-$3";"}'

我的预期输出:

1;0,2;
4;-0,5;
2;2,55;

但我的输出文件不显示带逗号的数字...

答案1

您的区域设置妨碍了您。看https://www.gnu.org/software/gawk/manual/html_node/Locale-influences-conversions.html

对于 GNU awk,您需要将POSIXLY_CORRECT环境变量和 LS_NUMERIC 环境变量设置为使用逗号作为小数点分隔符的语言环境:

POSIXLY_CORRECT=1 LC_ALL=en_DK.utf-8 gawk -F';' '$1+0 > 0 {print $1 FS $2-$3 FS}' file
1;0,2;
4;-0,5;
2;2,55;

$1+0 > 0也用来避免打印标题。你也可以使用NR > 1 && $1 > 0


您还可以使用gawk --posixgawk --use-lc-numeric代替 POSIXLY_CORRECT 环境变量。

答案2

或者,您可以执行以下操作:

awk -F';' '{ gsub(/,/,".", $0); save=$2-$3; gsub(/\./,",", save) }
           NR>1 && $1{print $1, save, ""}' OFS=';' infile
1;0,2;
4;-0,5;
2;2,55;
  • NR>1正在跳过第一行。
  • $1$1 >0那里使用了缩写。
  • OFS=';'设置输出F产量S运算符到;

相关内容