【问题标题】:Using bc on a column of values in a csv对 csv 中的一列值使用 bc
【发布时间】:2011-11-28 12:31:53
【问题描述】:

我有一个包含 5 列值的长 csv 文件。 如何从列中提取每个值并将此值传递给 bc 以在其上提取余弦?

我正在尝试使用 awk 来提取值,但是当我尝试将每个值都传递给 bc 时失败了。

提前感谢您的关注。

罗伯托

【问题讨论】:

  • 你说失败是什么意思?你收到错误了吗?你有没有得到与你预期不同的东西?并给出一些你的输入和预期输出的例子。
  • 您的 awk 版本不支持 cos() 函数。如果没有,请查找 nawk、/usr/xpg4/bin/awk 或 gawk。您应该能够在 awk 中执行 bc 可以执行的任何数学运算。祝你好运。
  • 有时 bash 对于这类任务真的很迟钝。恕我直言,如果您使用的是 linux 或 unix,只需在 Python 中执行...
  • @Oz123:只有当你不知道如何使用它时。在我看来,使用 python 来完成这样一个简单的任务是非常愚蠢的。
  • @flesk,正如您从我下面的帖子中看到的那样,我也知道如何使用 BASH,恕我直言,它比 AWK 答案更具可读性。然而,Python 代码的可表达性和清晰性简直胜出!

标签: bash csv awk bc


【解决方案1】:

您可以处理 csv(g)awk 以计算每个字段的余弦,例如:

awk -v FS=',' '{for (i=1;i++;i=NF) { printf(" %s\tcos: %s" FS,$i,cos($i)) } ; print }' INPUTFILE

HTH

【讨论】:

    【解决方案2】:

    如果您只想使用 awk 和 bc,就像您在问题中提出的那样,您可以执行以下操作:

    awk '{print "c(" $1 ")"}' file.csv | bc -l
    

    只要确保你使用管道包含例如"c(1)" 到bc -l

    【讨论】:

      【解决方案3】:

      哈,只是迟到了几分钟,虽然你的问题缺乏信息,尽管我写了你应该在 python 中做的事情,但我决定我将在 BASH(而不是 AWK)中做这个挑战。

      oz123@debian:~$ cat csvfile.csv 
      1,2,3
      4,5,6
      7,8,9
      oz123@debian:~$ cat csvfile.csv | ( while 
      > read line; 
      > do  
      > VAR1=`echo $line | cut -d "," -f1` ;
      > VAR2=`echo $line | cut -d "," -f2` ;
      > echo $VAR1+$VAR2 
      > echo $VAR1+$VAR2 | bc
      > 
      > done; 
      > 
      > )
      1+2
      3
      4+5
      9
      7+8
      15
      oz123@debian:~$ 
      

      好的,我的第一个解决方案确实很丑,而且计算量很大。这是一个更好的解决方案:

      oldifs=$IFS; export IFS=","; cat csvfile.csv | while read -a line; do echo ${line[2]}+${line[1]} | bc; done
      

      -a 标志将行转换为数组。 IFS 是内部字段分隔符(请参阅man bash)。

      【讨论】:

      • 就像我上面所说的,为什么他的问题需要使用您选择的脚本语言,而这实际上是一项非常简单的任务?他并不是在寻求帮助来使用 awk 和 bc 创建一个聊天机器人,该机器人还可以从互联网上获取实时足球比分,同时生成随机俳句。为此,我同意 python 在许多其他同样优秀的脚本语言中是一个不错的选择。
      • @flesk,使用 Python 可能很愚蠢。但我确实认为可读性很重要。 AWK 不能作为 BASH(恕我直言)读取。因此,我在这里提供了一个计算成本更低的解决方案,它也比整个 AWK 或 SED 解决方案更易于阅读。
      猜你喜欢
      • 2017-08-22
      • 2017-07-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多