2012-07-17 105 views
3

我有以下的CSV文件的:修改值在CSV使用bash腳本

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 

我想要做的就是在第二列修改值...

我已經可以做的是提取值並修改它是這樣的:

#!/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 

但我需要在那個文件中也列1 ...

我希望你們其中一個能給我一個提示,我只是被卡住了!

+0

我花了太多的時間試圖做這樣的事情。如果你的系統上有python,我建議你嘗試一下。 – 2012-07-17 12:50:22

+0

我絕對沒有py的經驗,但也許可以用類似的例子來解決它... – 2012-07-17 12:51:22

+0

它可能是最容易使用awk,但你需要更具體的你想做什麼。 – Kevin 2012-07-17 12:54:43

回答

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 
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 
+0

謝謝你,你讓我的一天! – 2012-07-17 13:05:16

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

2

這裏是一個幾乎純bash的解決方案,而無需臨時文件:

#!/bin/bash 

while IFS=$';' read col1 col2; do 
    echo "$col1; $(echo "scale=2;$col2/5" | bc -l)" 
done