如何根据小数点后的位数将格式化为字符串(不带空格)的数字分隔为带空格的数字

如何根据小数点后的位数将格式化为字符串(不带空格)的数字分隔为带空格的数字

我有一个来自模拟的文本文件,其中数字之间没有任何空格。下面给出一个例子。我想根据小数点数字(13)分隔数字。

5.656854249492415.594870951694315.594870951694315.594870951694321.466252583998021.466252583998021.466252583998027.4809024597083   

我想要如下的输出:

5.6568542494924   
15.5948709516943  
15.5948709516943  
15.5948709516943  
21.4662525839980  
21.4662525839980  
21.4662525839980  
27.4809024597083

我尝试使用下面的 sed 命令,但它不起作用。

sed -i 's/\(.\{14\}\)/\1 /g' input.txt

我已附上屏幕截图作为参考。在此输入图像描述

我很感激任何有用的建议。
谢谢

答案1

我认为你可以这样做grep

$ grep -Eo '[0-9]+\.[0-9]{13}' < input.txt
5.6568542494924
15.5948709516943
15.5948709516943
15.5948709516943
21.4662525839980
21.4662525839980
21.4662525839980
27.4809024597083

这是有效的,因为它从上一个匹配结束的位置开始查看下一个匹配,并且不查找重叠的匹配。您可以将其更改为[0-9]+\.[0-9]{0,13}允许更短的数字,前提是它们由非数字分隔。这也是有效的,因为匹配是贪婪的,所以如果有 13 个数字,它会吃掉第一个数字的所有数字,然后再继续下一个数字。

答案2

您可以使用它sed(点后 13 个字符):

# with new lines as in the output shown in the question
$ sed 's/\.\([^.]\{13\}\)/&\n/g' file
5.6568542494924
15.5948709516943
15.5948709516943
15.5948709516943
21.4662525839980
21.4662525839980
21.4662525839980
27.4809024597083

或者更简洁的 GNU sed

$ sed -E 's/\.[^.]{13}/&\n/g'

答案3

使用标准(非 GNU) (不能使用命令sed插入换行符):\ns

$ sed -e 's/[0-9]\{13\}/&:/g' -e 'y/:/\n/' file
5.6568542494924
15.5948709516943
15.5948709516943
15.5948709516943
21.4662525839980
21.4662525839980
21.4662525839980
27.4809024597083

这会:在输入中每运行 13 个数字后插入一个,然后使用该y命令将所有这些冒号替换为换行符。

或者,使用文字换行符:

sed 's/[0-9]\{13\}/&\
/g' file

或者,如果您的 shell 理解$'...'字符串:

sed $'s/[0-9]\\{13\\}/&\\\n/g' file

答案4

echo '5.6568542494924 15.5948709516943 15.594870951694315.594870951694321.466252583998021.466252583998021.466252583998027.4809024597083' |
    awk -F . '{ printf "%d.",$1; for(i=2;i<NF;i++) { frac=substr($i,1,13); intg=substr($i,14); printf "%s\n%d.",frac,intg; } print $NF;}'
5.6568542494924
15.5948709516943
15.5948709516943
15.5948709516943
21.4662525839980
21.4662525839980
21.4662525839980
27.4809024597083

该解决方案处理输入中的空格。

相关内容