5 列の値を持つ長い csv ファイルがあります。列からすべての値を抽出し、この値を bc に渡してコサインを抽出するにはどうすればよいですか?
awk を使用して値を抽出しようとしていますが、すべての値を bc に渡そうとすると失敗します。
ご関心をお寄せいただきありがとうございます。
ロベルト
次のように、フィールドごとの余弦を計算するためcsv
にを処理できます。(g)awk
awk -v FS=',' '{for (i=1;i++;i=NF) { printf(" %s\tcos: %s" FS,$i,cos($i)) } ; print }' INPUTFILE
HTH
質問で尋ねたように、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:~$
OK、私の最初の解決策は確かに醜く、計算量が膨大です。より良い解決策は次のとおりです。
oldifs=$IFS; export IFS=","; cat csvfile.csv | while read -a line; do echo ${line[2]}+${line[1]} | bc; done
-a
フラグは行を配列に変換します。これIFS
は、内部フィールド セパレータです (「 」を参照man bash
)。