Как добавить десятичные разделители к числам в определенных столбцах - Bash - PullRequest
1 голос
/ 29 октября 2019

У меня есть файл .txt, и мне нужно добавить запятые в качестве десятичных разделителей для улучшения читабельности. Числа существуют только в определенных столбцах, и я не мог найти способ сделать это. Столбцы разделены точками с запятой и могут содержать любой символ. Числа в третьем и четвертом столбцах.

Это

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

Я думал об использовании оператора if в awk, чтобы проверить, больше ли длина этих столбцов, чем3, но потом я не смог найти способ поставить запятые между каждыми тремя цифрами.

Я старался изо всех сил и придумал это, но интересно, что система, которую я использую, не запускает gawk, и яне знаю различий между gawk и awk, чтобы исправить мой код.

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

Ответы [ 4 ]

1 голос
/ 29 октября 2019

Это должно сделать это:

LC_ALL=en_US.UTF-8 awk -F';'  'BEGIN{ OFS=";" }{ $4=sprintf("%'"'"'d", $4); $3=sprintf("%'"'"'d", $3) ; print $0}' file.txt

Надеюсь, что это полезно.

0 голосов
/ 30 октября 2019

Предполагая, что вы спрашиваете, потому что sprintf("%'... не работает с вашим awk на вашем компьютере с UNIX, одним из способов было бы набрать левой клавишей каждое число с 0, чтобы сделать его кратным 3 цифрам, а затем поставить запятуюперед каждыми 3 цифрами, затем удалите начальные 0 и запятые:

$ awk 'BEGIN{OFS=FS=";"} {for (i=3; i<=4; i++) {$i=sprintf("%099d",$i); gsub(/.../,",&",$i); sub(/^(,0+)+/,"",$i)} } 1' 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

Вышеуказанное будет работать, если ваши входные числа не длиннее 99 цифр (например, меньше чем 1, а затем99 нулей). Если вы не хотите жестко кодировать ограничение, тогда, добавив немного больше кода, вы можете просто заполнить поля нулями до ближайшего кратного 3-х значному размеру:

$ awk 'BEGIN{OFS=FS=";"} {for (i=3; i<=4; i++) {$i=sprintf("%0*d",int((length($i)+2)/3)*3,$i); gsub(/.../,",&",$i); sub(/^(,0+)+/,"",$i)} } 1' 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

В форматировании нет зацикливанияпоэтому он должен быть эффективным даже для больших чисел.

0 голосов
/ 30 октября 2019
sed -r ':a; s/;([0-9]+)([0-9]{3})(([,][0-9]*)*)($|[;])/;\1,\2\3\5/g; ta' textfile

Объяснение:
sed -r: избегать обратной косой черты
:a;: метка для повторения замены
;([0-9]+): хотя бы одно число перед следующими тремя
([0-9]{3}): три цифры
(([,][0-9]{3})*): необязательные наборы запятых с 3 цифрами
($|[;]): конец строки или конец поля
/;\1,\2\3\5/g;: заменить данные с дополнительным значением на дополнительныезапятая
ta: когда замена сработала, вернитесь к метке a и повторите

0 голосов
/ 29 октября 2019

это преобразует все числа

$ awk -F';' 'function pp(x) {tt=int(x/1000); 
                             return tt?(pp(tt)","(x%1000)):x}
              BEGIN {OFS=FS} 
                    {for(i=1;i<=NF;i++) if($i+0==$i) $i=pp($i)}1' file


BitstreamCyberCJK
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
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

должно работать и для больших чисел ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...