我有一个csv文件,其数据如下
16:47:07,3,r-4-VM,230000000.,0.466028518635,131072,0,0,0,60,0
16:47:11,3,r-4-VM,250000000.,0.50822578824,131072,0,0,0,0,0
16:47:14,3,r-4-VM,240000000.,0.488406067907,131072,0,0,32768,0,0
16:47:17,3,r-4-VM,230000000.,0.467893525702,131072,0,0,0,0,0
我想缩短第5栏的价值。
期望的输出
16:47:07,3,r-4-VM,230000000.,0.46,131072,0,0,0,60,0
16:47:11,3,r-4-VM,250000000.,0.50,131072,0,0,0,0,0
16:47:14,3,r-4-VM,240000000.,0.48,131072,0,0,32768,0,0
16:47:17,3,r-4-VM,230000000.,0.46,131072,0,0,0,0,0
非常感谢您的帮助
答案 0 :(得分:4)
awk '{$5=sprintf( "%.2g", $5)} 1' OFS=, FS=, input
这将在第一行上舍入并打印.47
而不是.46
,但也许这是可取的。
答案 1 :(得分:1)
试试这个:
cat filename | sed 's/\(^.*\)\(0\.[0-9][0-9]\)[0-9]*\(,.*\)/\1\2\3/g'
到目前为止,输出是GNU / Linux标准输出,所以
cat filename | sed 's/\(^.*\)\(0\.[0-9][0-9]\)[0-9]*\(,.*\)/\1\2\3/g' > out_filename
会将所需结果发送至out_filename
答案 2 :(得分:1)
如果不需要舍入,即0.466028518635
需要打印为0.46
,请使用:
cat <input> | awk -F, '{$5=sprintf( "%.4s", $5)} 1' OFS=,
(这可以是Useless use of cat)的另一个例子
答案 3 :(得分:1)
你想要它在perl中,就是这样:
perl -F, -lane '$F[4]=~s/^(\d+\...).*/$1/g;print join ",",@F' your_file
测试如下:
> cat temp
16:47:07,3,r-4-VM,230000000.,0.466028518635,131072,0,0,0,60,0
16:47:11,3,r-4-VM,250000000.,10.50822578824,131072,0,0,0,0,0
16:47:14,3,r-4-VM,240000000.,0.488406067907,131072,0,0,32768,0,0
16:47:17,3,r-4-VM,230000000.,0.467893525702,131072,0,0,0,0,0
> perl -F, -lane '$F[4]=~s/^(\d+\...).*/$1/g;print join ",",@F' temp
16:47:07,3,r-4-VM,230000000.,0.46,131072,0,0,0,60,0
16:47:11,3,r-4-VM,250000000.,10.50,131072,0,0,0,0,0
16:47:14,3,r-4-VM,240000000.,0.48,131072,0,0,32768,0,0
16:47:17,3,r-4-VM,230000000.,0.46,131072,0,0,0,0,0
答案 4 :(得分:0)
sed -r 's/^(([^,]+,){4}[^,]{4})[^,]*/\1/' file.csv
答案 5 :(得分:0)
这可能适合你(GNU sed):
sed -r 's/([^,]{,4})[^,]*/\1/5' file
将第5次出现的非逗号替换为不超过4个字符的长度。