我有一个包含 5 列值的长 csv 文件。如何从列中提取每个值并将此值传递给 bc 以在其上提取余弦?
我正在尝试使用 awk 来提取值,但是当我尝试将每个值传递给 bc 时我失败了。
预先感谢您的关注。
罗伯托
您可以处理一个csv
with(g)awk
来计算每个字段的余弦,例如:
awk -v FS=',' '{for (i=1;i++;i=NF) { printf(" %s\tcos: %s" FS,$i,cos($i)) } ; print }' INPUTFILE
高温高压
如果您只想使用 awk 和 bc,就像您在问题中提出的那样,您可以执行以下操作:
awk '{print "c(" $1 ")"}' file.csv | bc -l
只需确保将包含例如“c(1)”的字符串通过管道传输到bc -l
.
哈,只是迟到了几分钟,虽然你的问题缺乏信息,尽管我写了你应该用 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
)。