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

Replace last character in specific column with value 0

如何用值 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

我会用 sed:

sed -e 's/^\([^;]*;[^;]*\).;/;/' filename

awk方法:

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

输出:

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

或与substr()函数相同:

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

使用 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, )}'

这导致以下输出:

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

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

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

向下舍入最后一位数,向下舍入两位数(个位和十位)将 10 替换为 100

或者,使用 GNU 进行简单替换会更容易 sed

$ sed 's/.;/0;/2'