このawkコマンドはどのように機能しますか?

このawkコマンドはどのように機能しますか?

次のファイルを検討してくださいtest.txt

pfg025G
pfg025T
pfg034T
pfg039G

次に、次のawkコマンドとその出力を考えてみましょう。

awk '(NR>1) {print "s/"p"/"$1"/g"}{p=$1}' test.txt

s/pfg025G/pfg025T/g
s/pfg025T/pfg034T/g
s/pfg034T/pfg039G/g

NR>11より大きい行の場合はtrueで、その項"$1"には有効ですが、"p"最初の行の値を取る項には無効です。なぜそんなことですか?NR>1最初のブロックだけを評価{}し、2番目のブロックを評価しないでください{p=$1}。最初に"$1"二重引用符があり、""2番目に二重$1引用符がないのはなぜですか?

答え1

あなたの(分割)awkコマンドは次のとおりです

awk '(NR>1) {print "s/"p"/"$1"/g"}
            {p=$1}'

意味は

  • {print "s/"p"/"$1"/g"}いつするのかNR>1
  • {p=$1}いつも
  • "s/"p"/"$1"/g"区切り引用符(1): "s/" + p + "/" + $1 + "/g"、引用または引用しpない$1
  • (1)+連結の場合、awkは暗黙の連結演算子として空白(空白なし)を使用することに注意してください。

最初の行では only が{p=$1}実行されます。

{print "s/"p"/"$1"/g"}最初の行が最初に実行され、p最初の行から値が初期化されます。

最後の行はp最終的にpfg039G削除されます。


セミコロンを使用して、同じコードブロック内で一連のコマンドを作成します。

awk '(NR>1) {print "s/"p"/"$1"/g" ; p=$1}' test.txt
s//pfg025T/g
s/pfg025T/pfg034T/g
s/pfg034T/pfg039G/g

これで、結果は以前の$1一致を使用して予想通りです。最初の行$1は空です。

関連情報