从文件列表中剪切并替换特定列

从文件列表中剪切并替换特定列
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.zzxyyzz.它通过在单独的捕获组中捕获三组字符(每个点与单个字符匹配的\(.\)两个字符),然后再次插入这些字符并在其间插入点来实现此目的。\(..\)

第二次替换会立即删除点后的任何零。

答案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

相关内容