次のファイルを検討してください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>1
1より大きい行の場合は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
は空です。