2014-10-03 67 views
0

我试图通过行改为在linux行的文件方含的数据是这样的代替字符串替换文件在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 

然后我不得不增加20亿到每一行的第一个整数和替换该整数。所以,最终的文件会像

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

这是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+=2000000000增加2000000000为所述第一值。那么,1为真,所以它执行默认的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的利润给格式化值存储到一个变量,以便然后将其正确打印。

+0

我可以知道downvote的原因吗? – fedorqui 2014-10-03 09:13:09

+0

由于第一数量非常大,该命令输出后,即将这样的:1.26737e + 10 B00BXNOD56 20141003 20141103 69765 1 4 6 1.26742e + 10 B008O9LLN4 20141003 20141103 602348 2 2 6 1.26756e + 10 B007BKFFZM 20141003 20141103 15857531 5 20 6 1.26764e + 10 093794811X 20141003 20141103 173515 1 3 6 1.26764e + 10 1560327146 20141003 20141103 173515 1 3 6 1.26777e + 10 B00DXYNQYC 20141003 20141103 502394 1 1 6 1.26803e + 10 B00IKL8VIO 20141003 20141103 495224 1 3 6 – user3034987 2014-10-03 09:13:52

+0

@ user3034987如果你说'awk'{$ 1 + = 2000000000; printf“%0.f \ n”,$ 1}'file' ?? – fedorqui 2014-10-03 09:21:51