4

次の CSV ファイルがあります。

2012-07-12 15:30:09; 353.2
2012-07-12 15:45:08; 347.4
2012-07-12 16:00:08; 197.6
2012-07-12 16:15:08; 308.2
2012-07-12 16:30:09; 352.6

私がしたいのは、2列目の値を変更することです...

私がすでにできることは、値を抽出して次のように変更することです。

#!/bin/bash
cut -d ";" -f2 $1 > .tmp.csv
for num in $(cat .tmp.csv)
    do
        (echo "scale=2;$num/5" | bc -l >> .tmp2.csv)
done
rm .tmp.csv
rm .tmp2.csv

しかし、そのファイルにも column1 が必要です...

あなたの誰かが私にヒントを与えてくれることを願っています。

4

4 に答える 4

3

bash一時ファイルを含まない、ほぼ純粋なソリューションは次のとおりです。

#!/bin/bash

while IFS=$';' read col1 col2; do
    echo "$col1; $(echo "scale=2;$col2/5" | bc -l)"
done
于 2012-07-17T13:30:30.790 に答える
3

あなたのコードから、これは私が理解したものです

入力

2012-07-12 15:30:09; 353.2 
2012-07-12 15:45:08; 347.4 
2012-07-12 16:00:08; 197.6 
2012-07-12 16:15:08; 308.2 
2012-07-12 16:30:09; 352.6 

Awk コード

awk -F ";" '{print $1 ";" $2/5}' 入力

出力

2012-07-12 15:30:09;70.64
2012-07-12 15:45:08;69.48
2012-07-12 16:00:08;39.52
2012-07-12 16:15:08;61.64
2012-07-12 16:30:09;70.52
于 2012-07-17T13:09:43.230 に答える
3

片道、使用awk:

awk '{ $NF = $NF/5 }1' file.txt

結果:

2012-07-12 15:30:09; 70.64
2012-07-12 15:45:08; 69.48
2012-07-12 16:00:08; 39.52
2012-07-12 16:15:08; 61.64
2012-07-12 16:30:09; 70.52

HTH

于 2012-07-17T13:10:23.570 に答える
2

で試してくださいawk

awk '
    BEGIN {
        ## Split fields with ";".
        FS = OFS = "; "
    }

    {
        $2 = sprintf( "%.2f", $2/5 )
        print $0
    }
' infile

出力:

2012-07-12 15:30:09; 70.64
2012-07-12 15:45:08; 69.48
2012-07-12 16:00:08; 39.52
2012-07-12 16:15:08; 61.64
2012-07-12 16:30:09; 70.52
于 2012-07-17T12:59:43.117 に答える