Использование bc для столбца значений в CSV - PullRequest
1 голос
/ 28 ноября 2011

У меня длинный CSV-файл с 5 столбцами значений.Как я могу извлечь каждое значение из столбца и передать это значение в bc для извлечения косинуса?

Я пытаюсь использовать awk для извлечения значений, но мне не удается передать каждое значение вдо н. э.

Заранее благодарим за проявленный интерес.

Роберто

Ответы [ 3 ]

2 голосов
/ 28 ноября 2011

Вы можете обработать csv с помощью (g)awk для вычисления косинуса поля, например:

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

HTH

1 голос
/ 29 ноября 2011

Если вы просто хотите использовать awk и bc, как вы уже задали в своем вопросе, вы можете сделать что-то вроде этого:

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

Просто убедитесь, что вы передали строку, содержащую, например, "c (1) "до bc -l.

0 голосов
/ 28 ноября 2011

Ха, всего на несколько минут позже, и хотя вашему вопросу не хватает информации, и, несмотря на то, что я написал, вы должны сделать это на 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).

...