2017-04-30 12 views
0

私はまだUnixを学んでおり、次のコード行を理解しています。awkを使ってファイルから文字列をパースする

echo "$lines" | awk '{split($0,a,":"); print a[3],a[2],a[1]}' 

上記のコード行で何が起こっているのか分かりません。それは配列を宣言し、解析する文字列と同じに設定していますか?配列を宣言している場合は、後で結果をコードに出力できないのはなぜですか?

echo "${a[1]}" 

上記の行は、文字列が解析されたときに配列aに格納されているものではなく、空の行を出力します。文字列には常に解析が必要なものがあることを知っています。配列を呼び出すと、スコープの内側にいることがわかります。私はちょうど私がコードで後でそれを印刷するのを妨げる配列aで何が起きているか理解していません。

+0

'awk'配列' a'は 'awk'スクリプトでのみ利用できます。それはシェルの一部ではありません。だから後で 'echo'コマンドでアクセスできないのです。 –

+0

次に、使用できる変数に配列を保存する方法はありますか? – Patrick

+1

はい(あなたのコメントはいくつかのコードを含むように更新されました)そうですか?VAR =($(echo "$ lines" | awk '{split($ 0、a、 ":")} 'a =($(echo" $ lines "| awk '{...}'))'を使ってシェル配列を代入したいかもしれません。しかし、これはすべての行を単一のシェル配列に処理します。それがOKかどうかを判断する必要があります。配列要素内のスペースもなくなります(したがって、 'aa bb:cc dd:ee ff gg'が含まれていれば、3つのAwk配列要素から7つのシェル配列要素が得られます)。それがあなたにとって問題かどうかを判断する必要があります。 –

答えて

1

コードは入力行ごとに行を印刷しています。あなたが出力を得ることができない場合、私の最初の推測は、あなたは入力を持っていないだろう。入力が与えられると

lines="ab:cd:ef 
ij:kl:m" 

出力は次のとおり

ef cd ab 
m kl ij 

awkは、入力のライン毎に(一重引用符の間のすべてである)コマンドを実行しています。最初に入力ライン$0をそれぞれ:に分割して配列aに分割し、最初の3つの要素を逆の順序で印刷します。

シェルの配列要素にアクセスしようとすると、echoが示唆しているとおり、あなたは遅すぎます。配列はawk内に存在し、awkが終了すると消えます。

関連する問題