acroniks Asked: 2018-03-23 03:32:10 +0800 CST2018-03-23 03:32:10 +0800 CST 2018-03-23 03:32:10 +0800 CST 从文件列表中剪切和替换特定列 772 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机器。 sed cut 3 个回答 Voted RomanPerekhrest 2018-03-23T03:39:17+08:002018-03-23T03:39:17+08:00 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-character-long 的子字符串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 如果支持 GNU awk,则更短的方法如下: awk -v FS="" '{ print $1, ($2$3$4)/10, $5 }' OFS='.' file FS=""- 如果值为空字符串 ( ""),则记录中的每个字符都将成为一个单独的字段。 Best Answer Kusalananda 2018-03-23T03:39:02+08:002018-03-23T03:39:02+08:00 $ 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. 它通过在单独的捕获组中捕获三组字符(每个点与单个字符匹配的\(.\)两个字符),然后再次插入这些字符,并在它们之间插入点。\(..\) 第二次替换删除点之后的任何零。 MiniMax 2018-03-23T08:32:20+08:002018-03-23T08:32:20+08:00 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
Awk
解决方案:substr(string, start [, length ])
- 返回一个length
-character-long 的子字符串string
,从字符号 开始start
。输出:
如果支持 GNU
awk
,则更短的方法如下:FS=""
- 如果值为空字符串 (""
),则记录中的每个字符都将成为一个单独的字段。第一个
sed
替换x.yy.zz
从xyyzz
. 它通过在单独的捕获组中捕获三组字符(每个点与单个字符匹配的\(.\)
两个字符),然后再次插入这些字符,并在它们之间插入点。\(..\)
第二次替换删除点之后的任何零。
GNU sed 解决方案
\B - 匹配除单词边界以外的任何地方;也就是说,如果左边的字符和右边的字符都是“单词”字符或都是“非单词”字符,则匹配。
sed
没有 GNU 特性的解决方案输出