如何为某些字段中的数字添加小数点分隔符

如何为某些字段中的数字添加小数点分隔符

我有一个 .txt 文件,我需要添加逗号作为小数分隔符以提高可读性。这些长数字只存在于某些列中,我找不到办法做到这一点。列之间用分号分隔,并且可以包含任何字符。我想过在 awk 中使用 if 语句来检查这些列的长度是否大于 3,但后来我找不到一种方法将逗号放在每三个数字之间。数字位于第三列和第四列。

BitstreamCyberCJK;Freeware;30275;28686;v2.0 beta (1998-03-17);Cyberbit.ttf (12.4 MB);Bitstream CyberCJK;Medium (Normal), Book, Roman;TTF;Cove

Y.OzFontN;Freeware;21957;57621;v13.00 sfnt rev 5 Pen-Ji (2010-08-24);YOzRN.TTC (13.5 MB);YOzFontN;Regular;TTC;Any

应该变成这样:

BitstreamCyberCJK;Freeware;30,275;28,686;v2.0 beta (1998-03-17);Cyberbit.ttf (12.4 MB);Bitstream CyberCJK;Medium (Normal), Book, Roman;TTF;Cove

Y.OzFontN;Freeware;21,957;57,621;v13.00 sfnt rev 5 Pen-Ji (2010-08-24);YOzRN.TTC (13.5 MB);YOzFontN;Regular;TTC;Any

答案1

如果您使用numfmtGNU Coreutils,并且您的语言环境支持此类分组,则可以使用:

numfmt -d ';' --field=- --grouping --invalid='ignore' < file

前任。

$ numfmt -d ';' --field=- --grouping --invalid='ignore' < file
BitstreamCyberCJK;Freeware;30,275;28,686;v2.0 beta (1998-03-17);Cyberbit.ttf (12.4 MB);Bitstream CyberCJK;Medium (Normal), Book, Roman;TTF;Cove

Y.OzFontN;Freeware;21,957;57,621;v13.00 sfnt rev 5 Pen-Ji (2010-08-24);YOzRN.TTC (13.5 MB);YOzFontN;Regular;TTC;Any

如果您知道哪些字段包含数字字段,则可以显式指定它们并省略处理--invalid

numfmt -d ';' --field=3,4 --grouping < file

%'如果您有 GNU awk,您可以使用格式修饰符执行类似的操作sprintf

gawk '
  BEGIN {OFS=FS=";"} 
  {for(i=1;i<NF;i++) {if($i ~ /^[0-9]+$/) $i = sprintf("%'\''d", $i)}} 
  1
' file

相关内容