我试图在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脚本创建任何其他临时文件
答案 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+=2000000000
将2000000000
添加到第一个值。然后,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
获利,将格式化值存储到变量中,然后正确打印。