在csv中的值列上使用bc

时间:2011-11-28 12:31:54

标签: bash csv awk bc

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

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

提前感谢您的兴趣。

罗伯特

3 个答案:

答案 0 :(得分:2)

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

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

HTH

答案 1 :(得分:1)

如果您只是想使用awk和bc,就像您在问题中提出的那样,您可以这样做:

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

请确保管道包含例如“c(1)”到bc -l

答案 2 :(得分: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:~$ 

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

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

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