다음 파일을 고려하십시오 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
첫 번째 블록만 평가 {}
하고 두 번째 블록은 평가하지 않아야 합니까 {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
은 비어 있습니다.