用值0替换特定列中的最后一个字符

时间:2017-12-02 16:57:25

标签: linux awk gawk

如何用值0替换第2列中的最后一个字符

输入

1232;1001;1 
2231;2007;1
2234;2009;2
2003;1114;1

输出所需

1232;1000;1 
2231;2000;1
2234;2000;2
2003;1110;1

4 个答案:

答案 0 :(得分:1)

使用gensub()

修改输入

您可以使用任意数量的GNU awk string functions来执行此操作,但gensub()命令特别有用。它有签名:

  

gensub(regexp,replacement,how [,target])

这使得它对这些变换非常灵活。

转换示例

# Store your input in a shell variable for MCVE convenience, although
# you can have this data in a file or pass it on standard input if you
# prefer.
example_input='1232;1001;1 
2231;2007;1
2234;2009;2
2003;1114;1'

# Use awk's gensub() string function.
echo "$example_input" | awk '{print gensub(/.;/, "0;", 2, $1)}'

这导致以下输出:

1232;1000;1
2231;2000;1
2234;2000;2
2003;1110;1

答案 1 :(得分:0)

我会用sed

来做到这一点
sed -e 's/^\([^;]*;[^;]*\).;/\10;/' filename

答案 2 :(得分:0)

awk 方法:

awk -F';' '{ sub(/.$/,0,$2) }1' OFS=';' file

输出:

1232;1000;1 
2231;2000;1
2234;2000;2
2003;1110;1

或与substr()函数相同:

awk -F';' '{ $2=substr($2,0,3)0 }1' OFS=';' file

答案 3 :(得分:0)

不一定更好,但数学数据的数学方法......

$ awk 'BEGIN{FS=OFS=";"} {$2=int($2/10)*10}1'

向下舍入最后的数字(1),向下舍入两位数(1和10),用10替换100

或者,使用GNU sed

可以更轻松地进行简单替换
$ sed 's/.;/0;/2'