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