仅使用sed对齐数字

时间:2018-10-26 00:10:29

标签: 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来实现。

任何帮助将不胜感激。

4 个答案:

答案 0 :(得分:0)

如果您改变主意,这是一个awk解决方案

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

  183,7

 2346,7

    7,999

将分隔符设置为逗号并将两个部分作为单独的字段处理

答案 1 :(得分:0)

尝试一下:

gawk -F, '{ if($0=="") print ; else printf "%5d,%-d\n", $1, $2 }' input.txt

答案 2 :(得分:0)

如果您使用的是 GNU sed ,则可以执行以下操作

sed -r 's/([0-9]+),([0-9]+)/printf "%5s,%d" \1 \2/e' input.txt

答案 3 :(得分:0)

假设每行只有一个数字; ,之前最多有四个数字,并且始终有一个,

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仅在成功时有条件分支,因此您需要使用以下circuit回结构:

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

其中ta(成功时到a的条件分支)用于跳过b(到结束的无条件分支)。 :at命令所引用的标签。