2016-09-12 3 views
2

私は次のような結果に到達するために、次のファイルを使用している次のように enter image description here2番目のファイルをAWKまたは他の方法で処理しているときに、1つのファイルからデータのリストを持つ配列を渡すにはどうすればよいですか?

私はこの結果に到達するために使用しているコマンドは次のとおりです。

awk -F"\t" '(FNR>1)&&(NR==FNR){map[$1]=$4; next}($1 in map){$3=substr($3,2); for(i=4;i<7;i++){$i=($i*map[$1])}; print $0}' file2.txt file1.txt 

このコマンドは限り正常に動作しますJanからMarまでの列のデータは同じですが、データが異なる場合はmap[$1]=$4のために問題が発生します。つまり、私は4列目の値を渡すだけです。 1月から3月までのすべての値を渡し、別のファイルの対応する値を掛けたいと思います。

私は、次のコードを試してみました:

awk -F"\t" '(FNR>1)&&(NR==FNR){{map[$1]=$0}; next}($1 in map){$3=substr($3,2); for(i=4;i<7;i++){split(map[$1],val);$i=($i*val[$i])}; print $0}' file2.txt file1.txt 

行全体を送信し、内部的に分割します。 私もマップに直接配列を渡す試してみました:

awk -F"\t" '(FNR>1)&&(NR==FNR){split($0,val); for(i=4;i<7;i++){map[$1][$i]=val[$i]}; print map[$1][$i]; next}($1 in map){$3=substr($3,2); for(i=4;i<7;i++){$i=($i*(map[$1][$i]))}; print $0}' file2.txt file1.txt 

私はこのquestion.Iに答えを得るために他の方法を使用して気にしない考えていた、我々はとにかく内部のawkコマンドを実行する必要があります別のawkコマンド? 最終編集:

awk -F"\t" '(FNR>1)&&(NR==FNR){map[$1]=$0; next}($1 in map){split(map[$1],temp);$3=substr($3,2); for(i=4;i<7;i++){$i=($i*temp[i])/12}; print $0}' file2.txt file1.txt 

これは私の場合で働いていたものです。

+2

サンプルデータがあれば、最初の出力行は625回でなければなりませんか? (50×150/12 = 625)。そうですか? – Borodin

+3

例を整数値の5列に減らすと、質問を読むのにもっと多くの人々が関心を集めます。現在、ほとんどの人が喜んで受け入れるよりもはるかに多くの努力をすることなく、木の木を見ることができません。 –

+2

浮動小数点値をすべて小数点に変更しました。あまりにも?あなたは 'データが違うとき'と言う - どのデータですか?別の方法は?あなたはそれが '問題を生み出す 'と言っています - どのような問題ですか?コアダンプ、構文エラー、間違った出力、出力なし、別の何か?あなたが知っていることを知らずにあなたが書いたことを読んだり、あなたの質問や問題を明確に述べるためにあなたの質問を編集したりするために少し努力してください。あなたはほとんど確かに解決するための非常に単純な問題を抱えていますが、それがまだ何か分かっていません! –

答えて

2

サンプルの入力/出力に関連性のない詳細が多すぎます。私はあなたの事例に利用できる単純化された問題を持っています。

$ head file{1,2} 
==> file1 <== 
1 10 20 30 
2 11 21 31 
3 12 22 32 

==> file2 <== 
1 6 
2 7 
3 8 

$ awk 'NR==FNR{a[$1]=$0; next} 
     $1 in a{split(a[$1],v); print $1,$2,v[2]+v[3]+v[4]}' file1 file2 

1 6 60 
2 7 63 
3 8 66 

あなたの不足している成分は、レコード全体$0split機能を使用していません。

+0

ありがとうございました。これは私が問題を解決するのに役立ちました。 コマンドは次のとおりです。 awk -F "\ t"(FNR> 1)&&(NR == FNR){map [$ 1] = $ 0; next}(地図では$ 1){split(map [$ 1]、temp); $ 3 = substr($ 3,2); for(i = 4; i <7; i ++){$ i =($ i * temp [i])/ 12}; print $ 0} 'file2.txt file1.txt 私は添え字の代わりに直接iの代わりに$ iをArrayの中で使っている間違いをしていました。 –

関連する問題