【问题标题】:Bash script multiplying CSV valuesBash 脚本乘以 CSV 值
【发布时间】:2014-01-03 05:15:12
【问题描述】:

我有一个棘手的 CSV,应该用 bash 进行编辑。 CSV 中的典型行如下所示

A;B;C;D;E

1234567;7654321;100,00;ABC;0,00

我的目标是将小数点(C 列)乘以一个因子(例如 0,01)并在 B 列中添加一个前缀。因此 CSV 之后将如下所示:

A;B;C;D;E

1234567;abc-7654321;105,00;ABC;0,00

【问题讨论】:

  • 你在这里尝试了什么?

标签: bash csv sed awk


【解决方案1】:

使用awk

awk -F\; '{$2="abc-"$2;$3*=0.01}1' OFS=\; file
1234567;abc-7654321;1;ABC;0,00

100,00*0,01=1 而不是105,00

【讨论】:

  • 似乎是一个非常干净的解决方案,但我对 awk 并不熟悉,也不知道如何让它完全工作。 =/
  • 什么不起作用,我们在这里为您提供帮助 :) awk 是进行此类更改的非常好的工具。
  • 好的,我试过了,它在第一次运行时就可以工作,但是有一个小错误。 awk -F ";" '{print "TD" $2 ";" $3*1.1}' $inputfile > $outputfile; 是我目前的代码。不幸的是,源小数是这种格式 1,5 所以当我乘以因子 2 时,它会导致 2.0
  • 好的。有点棘手,但我正处于这个阶段。无论如何,我需要保留原来的第一行。有任何想法吗? #!/bin/bash ############################## factor=1.1 sourcefile=659069_CustSpecific_20140103.txt inputfile=659069_CustSpecific_20140103.csv outputfile=import.csv ############################## cp $sourcefile $inputfile; sed -i -e 's/,/./g' $inputfile awk -F ";" '{print "TD" $2 ";" $3*$factor}' $inputfile > $outputfile;
  • awk 不会以这种方式读取变量,请从awk -F ";" '{print "TD" $2 ";" $3*$factor}' $inputfile > $outputfile 更改为awk -F ";" '{print "TD" $2 ";" $3*f}' f="$factor" $inputfile > $outputfile
【解决方案2】:
export factor=0.01
prefix=abc-
IFS=';' while read a b c d e; do
  echo $a;$prefix$b;$(echo "$(echo $c|tr ',' '.')*$factor" | bc | tr '.' ',');$d;$e
done < inputfile > outputfile

【讨论】:

  • cpu 开销很大
  • 好吧,这个问题需要一个 shell 脚本,而不是 fast shell 脚本。说“我需要一个 bash 脚本”有点傻。不,你没有。你需要一个程序。
  • 我从不说它不好或不工作(这就是我没有-1的方式),只是解决方案是通过使用另一种方式来避免使用 awk 该套件在这种情况下会更好.特别是由于每行都有很多子流程开始。但你是对的,你给他一个可行的解决方案,也许就足够了
  • 谢谢罗宾!我尝试了您的脚本,但“do”命令中的某处存在语法错误。如果这个脚本可以工作,那就完美了!
  • 抱歉,它不是脚本,要使其成为脚本,您需要在顶部添加#! /bin/bash。也许这就是问题
【解决方案3】:

感谢所有的贡献者,我终于可以将它们放在一起来编写以下 bash 代码:

#!/bin/bash
##############################
factor='1.1'
sourcefile=whatever.txt
inputfile=whatever.csv
outputfile=import.csv
##############################

cp $sourcefile $inputfile;
sed -i -e 's/,/./g' $inputfile

awk -F ";" '{
        if ($1 =="Cust_id")
                print "a;b";
        else
                print "abc-" $2 ";" $3*f;
        }' f="$factor" $inputfile > $outputfile
echo 0

输出看起来是这样的,也许有人可以告诉我如何将其转换为 x.2 十进制格式?

a;b
abc-1000317;6.556

【讨论】:

    猜你喜欢
    • 2016-12-16
    • 2012-07-16
    • 2014-07-10
    • 2017-12-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多