awkの印刷配列の結果を理解できませんか?

awkの印刷配列の結果を理解できませんか?

単純なfileインクルードの場合:

1        a
2        b
3        c
4        d
5        e
6        f
7        g
8        h
9        i
10       j

私は次のコマンドを使用します。

awk 'lines[NR]=$0 { print $lines[2]}' 

それは私に以下を与えます:

1        a
b
c
d
e
f
g
h
i
j

どうやってなぜ?こんなことはありませんか?

2 b

また、以下を更新すると

awk '{lines[NR]=$0} END { print lines[2]}' awk.write

2 b

そして使用 $

j

ベストアンサー1

awk変数とワークフローを混同しています。おそらく必要なものは次のとおりです(2行目のみ印刷)。

awk '{lines[NR]=$0} END{print lines[2]}' file

ただし、これは次のように簡単に行うことができます。

awk 'NR==2' file

質問に次のように指示します。

awk 'lines[NR]=$0 { print $lines[2]}' 
  • lines[NR]=$0awkここでは条件として解釈されます。awk次のメカニズムを持つワークフローがあります(すべての行に適用されます) 'condition{instructions}'lines[NR]=$0配列を埋めますが、これは常に真の条件です。これが、{...}コマンドブロックが各行に対して実行される理由です。
  • print $lines[2]配列の2番目の項目は印刷されませんlines[2]$lines[2]名前が配列の2番目の項目の内容である変数に展開されます。最初の行は初期化されていないため、print引数なしで呼び出されます。これは行全体を印刷することを意味します。ただし、(他のすべての行で)設定するとに展開されますprint $2。つまり、行の2番目のフィールドが印刷されます。

おすすめ記事