1

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

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

预先感谢您的关注。

罗伯托

4

3 回答 3

2

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

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

高温高压

于 2011-11-28T12:47:01.200 回答
1

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

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

只需确保将包含例如“c(1)”的字符串通过管道传输到bc -l.

于 2011-11-28T21:23:36.877 回答
0

哈,只是迟到了几分钟,虽然你的问题缺乏信息,尽管我写了你应该用 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)。

于 2011-11-28T12:59:03.333 回答