我需要仅使用 sed 命令将十进制数字与","符号对齐。","应位于第 5 个位置。例如:
183,7
2346,7
7,999
应该变成:
183,7
2346,7
7,999
逗号前的最大数字数为 4。我尝试使用它来删除空格:
sed 's/ //g' input.txt > nospaces.txt
然后我想到根据逗号前的位数添加空格,但我不知道如何仅使用 sed 来做到这一点。
任何帮助将不胜感激。
假设每行只有一个数字;,
前最多有四位数字,并且总是有一个,
:
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/;'
如果上一个s
失败,T
会跳转到命令的末尾。Posix 标准 sed 只有一个成功的条件分支,因此您需要使用此迂回结构:
sed 's/[^0-9,]*([0-9]+,[0-9]*).*/ 1/;ta;b;:a;s/.*(.....,.*)/1/;'
其中ta
(成功时a
的条件分支(用于跳过b
(无条件分支到结束(。:a
是t
命令引用的标签。
如果你改变主意,这里有一个awk
的解决方案
$ awk -F, 'NF{printf "%5d,%-dn", $1,$2} !NF' file
183,7
2346,7
7,999
将分隔符设置为逗号,并将这两个部分作为单独的字段处理
试试这个:
gawk -F, '{ if($0=="") print ; else printf "%5d,%-dn", $1, $2 }' input.txt
如果你使用的是GNU sed,你可以这样做,你可以这样做
sed -r 's/([0-9]+),([0-9]+)/printf "%5s,%d" 1 2/e' input.txt