2016-07-29 8 views
-1

私は入力されたtxtファイルをUNIXでソートしようとしていましたが、いくつかの問題が発生しました。AWKから配列へのデータ

Product,color,stock 
apple,red,400 
apple,green,400 
apple,yellow,400 
grape,purple,500 
banana,yellow,120 

これは入力ファイルです。単なるテキストファイルですが、私は自分の情報を少し統合したいと思います。

私が最初に...私はそれをプリントアウトした場合これは、以下で私を残してしまうので...

awk -F '[,]' 'NR >= 1 {b[$1];} 

のようなグループに

apple 
grape 
banana 

が、私の場合は自分の製品をawkのを一緒に使用私は問題に遭遇したその行に記載されている製品のすべての色などの他の情報を含めることを望んでいました。もし私が 'b'インデックスデータを別の配列に入れたいのであれば、どうすればいいのですか?(awkコードの外側から 'b'にアクセスできないようです)以下は動作するが、運はないと考えた。

awk -F '[,]' 'NR >= 1 {b[$1];}END{for (i in b) productArray+=(b[i])}' 
+2

[編集]あなたの質問を、そのサンプル入力与えられた期待される出力を含めること。 wrt 'awkコードの外側から 'b'にアクセスできないようです - もちろん、Cや他の言語で使用されている変数の値にアクセスできたことはありませんそのプログラムの外のプログラム? awkはシェルではなく、Cプログラムのようにシェルから呼び出すツールです。 –

答えて

0

awkには実際にそのようなネストされたリストはありません。あなたはデータが異なる配列(配列j)に行きたい場合は、これを行うことができます:あなたは2番目の列をしたい場合は

cat test.txt |awk -F '[,]' 'NR > 1 { b[$1]=$2} END {for (x in b) { j[x]; print x}}'

を1列に基づいて独自の行に崩壊し、あなたがかもしれませんこのような何かを:

$ cat test.txt |awk -F ',' 'NR > 1 { if ($1 in b) { b[$1] = b[$1] FS $2} else { b[$1]=$2}} END {for (x in b) { print x,": " b[x] }}' apple : red,green,yellow banana : yellow grape : purple

+0

その2番目のコードは素晴らしい動作します!それがどのように動作するのか少し不明。私はそれが既にbに存在するかどうかを見るために「製品」をチェックしているのを見るが、それ以降の事柄は不明である。特に最初の製品ではb [$ 1] = $ 2]があります。私が持っていたものです(ちょうどb [$ 1])が適切ではありませんか? – user3756215

+1

'b [$ 1] = $ 2'は、第2フィールド($ 2)の文字列を' b [$ 1] 'の値として設定することを意味します。次のレコードの 'product apple is red、green'などで' product apple is red 'と表示されます。 –

+0

Google UUOCと 'if($ 1 in b){b [$ 1] = b [$ 1] FS $ 2} else {b [$ 1 ] = $ 2} 'は、より一般的に/熟語的に' b [$ 1] =(b?b [$ 1] FS: "" $ 2'の$ 1)と書かれています。また、 '-v OFS = ':''を追加すると、最後のprintは 'print x、b [x]'になります。 –

関連する問題