2012-07-17 96 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