我有一个 .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
如果您使用numfmt
GNU 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