awk或sed更改文件中的列值

时间:2013-05-09 04:56:48

标签: linux shell sed awk

我有一个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

非常感谢您的帮助

6 个答案:

答案 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个字符的长度。