`nl` 호출은 번호 매기기 전에 모든 입력을 흡수합니다.

`nl` 호출은 번호 매기기 전에 모든 입력을 흡수합니다.

이것이 어떻게 달성될 수 있습니까?

매뉴얼에 적용 가능한 옵션이 표시되지 않습니다.

1,000만 줄 이후에 들여쓰기가 깨지는지 적극적으로 확인해 봤습니다.

다음과 같이 확인할 수 있습니다.

$ (for i in `seq 0 10000000`; do echo "$i"; done) | nl

이렇게 많은 행을 자주 생성하지는 않지만 예전처럼 손상되는 것을 원하지 않습니다. 이것이 어떻게 달성될 수 있습니까?

답변1

nl필요한 최대량을 측정하기 위해 전체 입력을 버퍼링해야 한다고 제안하는 경우 이는 스트리밍 필터의 정신에 전혀 맞지 않습니다. 드문 예외( sort예:)를 제외하고 핵심 유틸리티는 스트림을 즉시 처리하려고 시도합니다. 특히 스트림이 거의 무한한 파이프라인에서 사용될 수 있는 경우(예: nl점진적으로 필터링되어 파일로 리디렉션되는 로그 스트림은 상당히 많은 데이터를 축적할 수 있음) 데이터의 양).

패딩을 처리하는 표준 방법은 예상되는 최대 너비를 매개변수로 지정하는 것입니다. 이 경우 패딩을 끄거나(어쨌든 저는 이것을 선호합니다. 앞에 공백으로 구분된 열을 두는 것이 합리적입니다) 다른 너비를 설정할 수 있습니다. 비교하다:

seq 0 10000000 | nl -w12 # default right-justify, 12 character width

seq 0 10000000 | nl -w1 # default right-justify, 1 character width (no padding)

seq 0 10000000 | nl -w1 -s' ' # right-justify, space delimited instead of tab

seq 0 10000000 | nl -nln # left-justify

만약 너라면진짜이 작업을 자동으로 수행하려면 wc -l먼저 길이를 측정한 다음 -w적절한 설정을 지정하면 됩니다.

답변2

seq 0 10000000천만 1개의 행으로 확장 되며 bash값을 반복할 수 있도록 메모리에 저장해야 합니다.저것문제는 시스템의 메모리 + 스왑을 모두 사용하기 전에 이를 종료할 수 있었다는 것입니다(최신 커널은 종료할 프로세스를 올바르게 결정하지만 메모리가 부족하여 다른 프로세스를 종료하고 싶지 않았습니다).

nl입력을 읽는 또는 또는 다른 명령 nl으로 바꿔서 확인할 수 있습니다 .catwc

bashmuru의 버전은 모든 데이터를 중간에 저장할 필요 없이 동일해야 합니다 .

편집: 숫자 패딩에 관한 것이라면 맨페이지 10초를 읽으면 nl -w... Use 옵션이 나올 것으로 예상됩니다 nl -w8. 줄 번호와 줄 내용 사이의 큰 간격(기본 탭 사용으로 인해)이 마음에 들지 않으면 -s' '맨페이지에 추가하여 쉽게 찾을 수 있습니다. 질문에 for 루프가 있는 이유가 여전히 궁금합니다.

관련 정보