对 csv 中的一列值使用 bc

发布于 2024-12-18 04:18:11 字数 139 浏览 2 评论 0原文

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

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

预先感谢您的兴趣。

罗伯托

I have a long csv file with 5 columns of values.
How can I extract every value from a column and pass this value to bc to extract a cosine on it?

I'm trying using awk to extract the values but I fail when I try to pass every single value to bc.

Thank you in advance for your interest.

Roberto

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

情话难免假 2024-12-25 04:18:11

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

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

HTH

You can process a csv with (g)awk to calculate per field cosines, like:

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

HTH

寻找我们的幸福 2024-12-25 04:18:11

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

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

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

If you just want to use awk and bc, like you've asked in your question you could do something like this:

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

Just make sure you pipe a string containing e.g. "c(1)" to bc -l.

谎言月老 2024-12-25 04:18:11

哈,晚了几分钟,尽管你的问题缺乏信息,而且尽管我写了你应该用 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)。

Ha, Just a few minutes late, and although your question is lacking info, and despite what I wrote you should do it in python, I decide that for the challenge I'll do it in BASH (and NOT 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:~$ 

OK, My first solution is indeed UGLY, and computationally expansive. Here is a nicer solution:

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

the -a flag turns the lines into arrays. The IFS is The Internal Field Separator (see man bash).

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文