0

次のようなデータを含む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

あなたの助けは大歓迎です

4

6 に答える 6

4
awk '{$5=sprintf( "%.2g", $5)} 1' OFS=, FS=, input

.47これにより、最初の行ではなく丸められて出力されます.46が、おそらくそれが望ましいでしょう。

于 2013-05-09T05:07:39.747 に答える
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

于 2013-05-09T05:09:11.473 に答える
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
于 2013-05-09T05:22:08.260 に答える
1

丸めが望ましくない場合、つまり0.466028518635として出力する必要がある 場合は0.46、次を使用します。

cat <input> | awk -F, '{$5=sprintf( "%.4s", $5)} 1' OFS=,

(これは cat の無駄な使用の別の例です)

于 2013-05-09T05:18:31.083 に答える
0
sed -r 's/^(([^,]+,){4}[^,]{4})[^,]*/\1/' file.csv
于 2013-05-09T05:33:02.453 に答える
0

これはうまくいくかもしれません(GNU sed):

sed -r 's/([^,]{,4})[^,]*/\1/5' file

これにより、5 番目に出現する非コンマが 4 文字以下の長さに置き換えられます。

于 2013-05-09T06:05:57.583 に答える