awk에서 중괄호 내부 할당 및 중괄호 외부 할당

awk에서 중괄호 내부 할당 및 중괄호 외부 할당

~에서이 문제, 나는 다음과 같은 해결책으로 대답했습니다.

awk 'FNR==NR{a[FNR]=$2;next}{$NF=a[FNR]}1' file2 file1

예상대로 작동합니다.

하지만 내 마음에 떠오르는 첫 번째 해결책은 다음과 같습니다.

$ awk 'FNR==NR{a[FNR]=$2;next}$NF=a[FNR]' file2 file1
A 63 9 6
B 45 3 5

awkwhen 이 첫 번째 줄을 인쇄하지 않기 때문에 작동하지 않습니다 file1. 이것은 나를 놀라게 하며 왜 awk첫 번째 줄을 건너뛰는지 모르겠습니다 .

여기 몇 가지 예가 있어요.

$ awk 'FNR==NR{next}$1=123' file2 file1 
123 23 8 T
123 63 9 9
123 45 3 J  

$ awk 'FNR==NR{a[FNR]=$2;next} FNR in a' file2 file1
A   23  8   T
A   63  9   9
B   45  3   J

awk두 예제 모두 예상대로 작동하는 것을 볼 수 있습니다 . 먼저 레코드 값에 영향을 미치는 현재 레코드의 필드에 새 값을 할당하고 awk새 값을 인쇄합니다. 두 번째는 의 awk모든 레코드가 처리되었으며 file2건너뛴 레코드가 없음을 보여줍니다.

awk첫 번째 솔루션에서 첫 번째 줄을 건너뛰는 이유는 무엇 입니까?

나는 그것을 사용 gawk 4.0.1하고 테스트했습니다 mawk 1.3.3.

답변1

당신은:

$NF=a[FNR]

최종 조건(인쇄 여부를 결정하는 조건)입니다. Assignment는 할당된 값을 반환합니다(이 경우 ) a[FNR]. 질문을 연결하는 데이터 파일의 첫 번째 줄은 다음과 같습니다.

A   0

a[FNR]로 초기화됩니다 $2. 이는 a[FNR]is의 값 0이 awk의 거짓 값임을 의미합니다. 이는 할당이 false임을 의미하며, 이는 조건을 false로 만들고 기본 인쇄 동작을 억제합니다. 데이터 파일을 다음과 같이 변경하면:

A   1
A   6   
B   0

그러면 첫 번째 줄은 인쇄되지만 마지막 줄은 손실됩니다.

따라서 누락된 첫 번째 행이 아니라 마지막 필드가 0(또는 비어 있음)이 있는 행입니다. 정확히 첫 번째 줄이고 첫 번째 줄만 이렇습니다.

답변2

약간의 조사 끝에 답을 찾았습니다.

첫째, 따르면이것:

Expression Patterns

An expression pattern will be evaluated as if it were an expression in a 
Boolean context. If the result is true, the pattern will be considered to 
match, and the associated action (if any) will be executed. If the result is 
false, the action will not be executed.

그래서 내 경우에는 $NF=a[FNR]표현 모드로 간주됩니다. 문서에 따르면 할당 결과는 true또는 으로 평가됩니다 false.

내 예에서는 할당 결과가 0부울 컨텍스트에서 평가되어 false패턴이 불일치로 간주되어 아무 작업도 수행되지 않습니다.

@Michael Homer의 메모

The assignment to m returned the value assigned.다음은 in이 올바르지 않음을 보여주는 예입니다 awk.

$ awk 'function test() {a=2} BEGIN{print test()}'
<blank line>

$ perl -e 'sub test {$a=2}; print test'
2

awk보시다시피, 예제에서는 어떤 할당이 반환됩니까?

awk 'n=(m=5);END{print n}' prints 5왜냐하면부작용awk, 이는 할당이 값을 반환한다는 의미는 아닙니다 .

관련 정보