줄 번호를 인쇄하지만 빈 줄의 줄 카운터를 재설정하는 방법은 무엇입니까?

줄 번호를 인쇄하지만 빈 줄의 줄 카운터를 재설정하는 방법은 무엇입니까?

다음을 포함하는 file.txt가 있습니다.

this is the first
second line
not last line

fourth but first
second in list
seventh in file
seventh with nl

일반적으로 다음과 같이 cat파이프 합니다.|nl

$> cat file.txt | nl
1  this is the first
2  second line
3  not last line

4  fourth but first
5  second in list
6  seventh in file
7  seventh with nl 

하지만 빈 줄이 나타나면 다음과 같이 줄 번호를 재설정해야 합니다.

$> alias_or_function file.txt
1  this is the first
2  second line
3  not last line

1  fourth but first
2  second in list
3  seventh in file
4  seventh with nl 

Express 함수나 별칭을 사용하여 이 작업을 어떻게 수행할 수 있나요 ~/.zshrc?

답변1

빈 줄을 \:\:nl페이지 본문의 시작 부분으로 바꿀 수 있습니다.

<your-file sed 's/^[[:space:]]*$/\\:\\:/' | nl

그래서 함수로서:

number-lines-of-paragraphs() {
  sed -e 's/^[[:space:]]*$/\\:\\:/' -- "$@" | nl
}

(입력에 , , 도 나타나면 nl머리글/본문/바닥글 구분 기호로 이해되므로 일반적으로 임의의 텍스트에 줄 번호를 추가하는 데 사용할 수 없습니다.)\:\:\:\:\:\:nl

다음 주의 사항 없이 동일한 출력 형식을 얻을 수도 있습니다 awk.

awk 'NF {printf "%6u\t%s\n", FNR, $0; next}; {FNR = 0; print}'

아니면 다른 사람들이 여기에 게시한 내용의 일부 변형입니다.

위의 숫자는왼쪽 패딩최대 6자 뒤에 TAB 문자가 옵니다. 이는 기본 nl출력 형식( default 와 %6u\t%s\n동일 )과 동일하지만 물론 이 형식을 원하는 대로 조정할 수 있습니다.nl-s $'\t' -n rn -w 6

그러나 이제 임의의 파일 이름을 인수로 취하는 함수로 만들려면 awk문자가 포함된 파일 이름을 차단한다는 자체 주의 사항에 직면하게 됩니다. =왜냐하면 해당 문자는 awk 변수 할당으로 해석되기 때문입니다(적어도 첫 번째 왼쪽의 콘텐츠는 =유효한 awk 변수 이름처럼 보입니다. gawk다음 방법을 사용하여 이 문제를 해결할 수 있습니다 .

number-lines-of-paragraphs() {
  gawk -e '
    NF {printf "%6u\t%s\n", FNR, $0; next}
    {FNR = 0; print}' -E /dev/null "$@"
}

이 함수가 여러 파일에 전달되면 각 파일의 시작 부분에서 줄 번호가 재설정됩니다. 메소드와 같이 모든 파일의 내용을 스트림으로 전체적으로 번호를 매기려면 위와 같이 sed | nl바꾸십시오 .FNRNR

어떤 경우에도 sed는 현재 디렉터리에서 호출된 파일(이를 해결하는 데 사용됨)이 gawk아닌 stdin으로 이해됩니다 .--./-

답변2

사용하고 싶은 경우 awk:

$ cat nl.awk
{
   if ( $0 == "" ) {
      count = 0
      print
   } else
      print ++count, $0
}

산출:

$ awk -f nl.awk infile
1 this is the first
2 second line
3 not last line

1 fourth but first
2 second in list
3 seventh in file
4 seventh with nl

답변3

awk를 사용하세요:

awk '{ c=NF?++c:"" } {print c,$0}' file

그 뜻은:

  • NF?필드 (공백이 아닌 문자) 가 있으면 c증가합니다 ++c.
  • 필드가 없으면(문자 없음) 행 카운터가 지워집니다.
  • 카운터를 인쇄하고 실제 줄을 따릅니다.print c,$0

불행히도 이 짧은 솔루션은 빈 줄을 공백이 포함된 줄(또는 실제로 OFS 값)로 변환합니다. 이것이 문제인 경우 다음과 유사한 해결 방법을 사용하십시오.

awk 'NF{$0=++c" "$0}!NF{c=0}1' file

빈 줄을 로 변경할 이유가 없습니다 \:\:.

관련 정보