이 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첫 번째 블록만 평가 {}하고 두 번째 블록은 평가하지 않아야 합니까 {p=$1}? 첫 번째에는 "$1"큰따옴표가 있고 ""두 번째에는 큰 $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은 비어 있습니다.

관련 정보