41703
10002
30003
40002
40000
20203
20203
30100
50000
50000
50000
50000
70700
70600
我有这个文件。我想要输出为
4.17.3
1.0.2
3.0.3
4.0.2
4.0.0
2.2.3
2.2.3
3.1.0
5.0.0
5.0.0
5.0.0
5.0.0
7.7.0
7.6.0
我正在solaris机器上工作。
答案1
Awk
解决方案:
awk '{ printf "%d.%d.%d\n", substr($1,1,1), substr($1,2,3)/10, substr($1,5) }' file
substr(string, start [, length ])
- 返回 的一个length
字符长的子字符串string
,从字符号 开始start
。
输出:
4.17.3
1.0.2
3.0.3
4.0.2
4.0.0
2.2.3
2.2.3
3.1.0
5.0.0
5.0.0
5.0.0
5.0.0
7.7.0
7.6.0
如果awk
支持 GNU,则更短的方法如下:
awk -v FS="" '{ print $1, ($2$3$4)/10, $5 }' OFS='.' file
FS=""
- 如果值为空字符串 (""
),则记录中的每个字符将成为一个单独的字段。
答案2
$ sed -e 's/\(.\)\(..\)\(..\)/\1.\2.\3/' -e 's/\.0/./g' file
4.17.3
1.0.2
3.0.3
4.0.2
4.0.0
2.2.3
2.2.3
3.1.0
5.0.0
5.0.0
5.0.0
5.0.0
7.7.0
7.6.0
第一个sed
替换创建x.yy.zz
自xyyzz
.它通过在单独的捕获组中捕获三组字符(每个点与单个字符匹配的\(.\)
两个字符),然后再次插入这些字符并在其间插入点来实现此目的。\(..\)
第二次替换会立即删除点后的任何零。
答案3
GNU sed 解决方案
sed -r 's/\B(..)/.\1./; s/\.0/./g' input.txt
\B- 除了单词边界之外的任何地方都匹配;也就是说,如果左侧的字符和右侧的字符都是“单词”字符或都是“非单词”字符,则它匹配。
sed
没有 GNU 特性的解决方案
sed -r 's/(.)(..)/\1.\2./; s/\.0/./g' input.txt
输出
4.17.3
1.0.2
3.0.3
4.0.2
4.0.0
2.2.3
2.2.3
3.1.0
5.0.0
5.0.0
5.0.0
5.0.0
7.7.0
7.6.0