Выровняйте числа, используя только sed - PullRequest
0 голосов
/ 26 октября 2018

Мне нужно выровнять десятичные числа с символом ",", используя только команду sed."," Должен идти в 5-й позиции.Например:

183,7 

    2346,7 

        7,999 

Должно превращаться в:

  183,7 

 2346,7 

    7,999 

Максимальное количество цифр перед запятой равно 4. Я пытался использовать это для удаления пробелов:

sed 's/ //g' input.txt > nospaces.txt

А потом я подумал о добавлении пробелов в зависимости от количества цифр перед запятой, но я не знаю, как это сделать, используя только sed.

Любая помощь будет признательна.

Ответы [ 4 ]

0 голосов
/ 26 октября 2018

Предполагая, что в каждой строке есть только один номер;что перед , должно быть не более четырех цифр и что всегда есть ,:

sed 's/[^0-9,]*\([0-9]\+,[0-9]*\).*/    \1/;s/.*\(.....,.*\)/\1/;'

Первая s избавляет от всего, кроме (первого) числа наи ставит перед ней четыре пробела.Второй удаляет все перед пятым символом до ,, оставляя достаточно места для правого выравнивания числа.

Вторая команда s может манипулировать строками ввода, которые не совпадают с первым s команда.Если возможно, что вход содержит такие строки, вы можете добавить условную ветвь, чтобы избежать выполнения второй замены, если первая не удалась.С Gnu sed это тривиально:

sed 's/[^0-9,]*\([0-9]\+,[0-9]*\).*/    \1/;T;s/.*\(.....,.*\)/\1/;'

T переходит к концу команд, если предыдущая s не удалась.У Posix Standard Sed есть только условная ветвь в случае успеха, поэтому вам нужно использовать эту обходную конструкцию:

sed 's/[^0-9,]*\([0-9]\+,[0-9]*\).*/    \1/;ta;b;:a;s/.*\(.....,.*\)/\1/;'

, где ta (условная ветвь до a в случае успеха) используется для пропуска b (безусловная ветвь до конца).:a - метка, на которую ссылается команда t.

0 голосов
/ 26 октября 2018

Попробуйте с этим:

gawk -F, '{ if($0=="") print ; else printf "%5d,%-d\n", $1, $2 }' input.txt
0 голосов
/ 26 октября 2018

Если вы используете GNU sed , вы можете сделать следующее:

sed -r 's/([0-9]+),([0-9]+)/printf "%5s,%d" \1 \2/e' input.txt
0 голосов
/ 26 октября 2018

если вы передумаете, вот решение awk

$ awk -F, 'NF{printf "%5d,%-d\n", $1,$2} !NF' file

  183,7

 2346,7

    7,999

установите разделитель на запятую и обрабатывайте обе части как отдельные поля

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