使用Bash脚本修改CSV中的值

5

我有以下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

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

我已经能够提取该值并进行如下修改:

#!/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...希望你们中的某位能给我一个提示,我现在完全卡住了!

我花了太多时间尝试做这样的事情。如果你的系统上有Python,我建议你尝试使用它。 - Johan Lundberg
我完全没有 Python 经验,但可能可以通过类似的示例来解决这个问题。 - Mirco Schmidt
最简单的方法可能是使用awk,但您需要更具体地说明您想要做什么。 - Kevin
嗨Kevin,我将把第二列中的值除以5,并将其写回csv文件。 - Mirco Schmidt
4个回答

4
从你的代码中,我理解了以下内容:

输入

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}' input

输出结果

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

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


3

这里有一个几乎纯的bash解决方案,不需要临时文件:

#!/bin/bash

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

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接