이 코드를 사용하여 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 스크립트(닫는 중괄호 안의 부분)가 결과를 인쇄합니다.