在linux中替换文件的字符串

时间:2014-10-03 09:04:06

标签: linux shell

我试图在linux中逐行读取一个包含类似数据的文件

522240227       B009CPMJ1M      20141003        20141103        1063278  1       1       6
604710621       B004NPI3OI      20141003        20141103        166431   1       1       6
1498812521      B00LFEHWJM      20141003        20141103        1044646  1       10      6
1498812521      B00D3IK0Y2      20141003        20141103        1044646  2       10      6

然后我必须将2000000000添加到每行的第一个整数并替换该整数。所以最终文件就像

2522240227       B009CPMJ1M      20141003        20141103        1063278  1       1       6
2604710621       B004NPI3OI      20141003        20141103        166431   1       1       6
31498812521      B00LFEHWJM      20141003        20141103        1044646  1       10      6
31498812521      B00D3IK0Y2      20141003        20141103        1044646  2       10      6

我是否可以在同一个文件上执行此操作,而无需使用shell脚本创建任何其他临时文件

1 个答案:

答案 0 :(得分:1)

这是为了awk!

awk '{$1+=2000000000}1' file

它返回:

2522240227 B009CPMJ1M 20141003 20141103 1063278 1 1 6
2604710621 B004NPI3OI 20141003 20141103 166431 1 1 6
3498812521 B00LFEHWJM 20141003 20141103 1044646 1 10 6
3498812521 B00D3IK0Y2 20141003 20141103 1044646 2 10 6

非常明确:$1+=20000000002000000000添加到第一个值。然后,1为True,因此它会执行默认的awk操作:{print $0},即打印该行。

要替换文件,请重定向到临时文件,然后移动:

awk '{$1+=2000000000}1' file > new_file && mv new_file file

由于它是一个很大的数字并且是以e + xx格式打印的,因此我们使用sprintf()修复格式:

awk '{$1 = sprintf("%0.f", $1+=2000000000)}1' file

这会使sprintf获利,将格式化值存储到变量中,然后正确打印。