我只需要使用sed命令将小数点与“,”符号对齐。 “,”应排在第5位。例如:
183,7
2346,7
7,999
应变成:
183,7
2346,7
7,999
逗号前的最大数字为4。我尝试使用此字符删除空格:
sed 's/ //g' input.txt > nospaces.txt
然后我考虑根据逗号前的位数添加空格,但是我不知道如何仅使用sed来实现。
任何帮助将不胜感激。
答案 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
(到结束的无条件分支)。 :a
是t
命令所引用的标签。