仅使用 sed 对齐数字

  • 本文关键字:对齐 数字 sed bash sed
  • 更新时间 :
  • 英文 :


我需要仅使用 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(无条件分支到结束(。:at命令引用的标签。

如果你改变主意,这里有一个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

最新更新