awk 진술 설명

awk 진술 설명

이 코드를 사용하여 20개 행마다 새 열을 시작하고 각 열은 탭으로 구분됩니다. 이 게시물의 코드를 가져와서 약간 수정했습니다.n번째 행마다 새 열을 시작하는 방법은 무엇입니까?

awk '{a[NR%20] = a[NR%20] (NR<=20 ? "" : "\t") $0} END {for (i = 1; i <= 20; i++) print a[i%20]}' 

내가 원하는 대로 정확하게 작동합니다. 그러나 나는 그것이 어떻게 작동하는지 잘 이해하지 못합니다. 누군가 나에게 이것을 설명해 줄 수 있습니까? $0파일의 전체 레코드(줄)를 읽고 물음표 앞의 조건을 평가하고 true이면 첫 번째 문을 실행하고 false이면 두 번째 문을 실행한다는 것을 알고 있습니다 . 따라서 이 경우 NR<=20첫 번째 열에 있기 때문에 아무것도 인쇄되지 않지만, NR>20새 열을 시작하기 위해 탭이 인쇄됩니다. 또한 for 루프는 a[1%20]is 로 시작하여 is , 마지막으로 is a[1]로 배열의 요소를 인쇄한다는 것도 알고 있습니다 . 하지만 그것은 무엇을 하는가? 왜 그 자체와 동일하게 설정됩니까? 생략하면 20개의 빈 줄이 인쇄되는 것을 발견했습니다.a[19%20]a[19]a[20%20]a[0]a[NR%20] = a[NR%20]a[NR%20] = a[NR%20]

답변1

에서는 awk공백으로 구분된 표현식이 연결됩니다. 이 연결은 POSIX awk 매뉴얼에 설명되어 있습니다.표현식 테이블(해당 페이지의 형식은 그다지 명확하지 않으므로 읽기가 더 쉽습니다 man 1p awk). 현재 값 +/+ 현재 레코드와 a[NR%20]연결됩니다 . 처음 20개 레코드의 경우 배열 값과 삼항 표현식은 모두 빈 문자열이 됩니다. 괄호를 사용하면 더 명확해질 수 있습니다."""\t"?:

a[NR%n] = (a[NR%n] (NR<=n ? "" : "\t") $0)

답변2

(NR<=20 ? "" : "\t")두 번째 항목은 수정 중이므로 a[20%20]자체와 동일하게 설정되지 않지만 NR > 20인 경우 테이블이 추가됩니다.

그런 다음 END 스크립트(닫는 중괄호 안의 부분)가 결과를 인쇄합니다.

관련 정보