~에서이 문제, 나는 다음과 같은 해결책으로 대답했습니다.
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
awk
when 이 첫 번째 줄을 인쇄하지 않기 때문에 작동하지 않습니다 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
, 이는 할당이 값을 반환한다는 의미는 아닙니다 .