파일 끝의 빈 줄 수 계산

파일 끝의 빈 줄 수 계산

파일 끝에 빈 줄이 있는 파일이 있습니다. grep스크립트에서 변수로 전달된 파일 이름을 사용하여 파일 끝의 빈 줄 수를 계산할 수 있나요 ?

답변1

빈 줄이 있는 경우오직마지막에

grep  -c '^$' myFile

또는:

grep -cx '' myFile

답변2

그냥 재미로 뭔가 소름 끼치네요 sed.

#!/bin/sh
sed '/./!H;//h;$!d;//d;x;s/\n//' "$1" | wc -l

설명하다:

  • /./모든 문자가 포함된 행을 지정하므로 /./!빈 행(예 /^$/: 반대 패턴을 재사용하고 싶습니다)은 명령 H이 이를 예약된 공간에 추가합니다. 따라서 각 빈 줄에 대해 예약된 공간에 한 줄을 추가하면 항상 빈 줄 수보다 한 줄이 더 많아지게 됩니다. 이 문제는 나중에 다루겠습니다.
  • //h빈 패턴은 모든 문자인 마지막 정규식과 일치하므로 비어 있지 않은 줄은 처리되고움직이는수집된 행을 1로 "재설정"하여 명령을 통해 공간을 예약합니다 h. 다음 빈 줄을 추가하면 예상대로 두 줄이 다시 나타납니다.
  • $!d마지막 줄을 제외한 모든 줄에 대한 출력 없이 스크립트를 중지하므로 마지막 줄 이후의 추가 명령만 실행됩니다. 따라서 예약된 공간에 수집한 모든 빈 줄은 파일 끝에 있습니다. 좋아요
  • //d: d공백이 아닌 라인에 대해서만 명령을 다시 실행합니다. 따라서 마지막 줄이 비어 있지 않으면 sed아무런 출력도 없이 종료됩니다. 제로 라인. 좋아요
  • x저장 공간과 패턴 공간을 교환하면 수집된 행이 이제 처리를 위해 패턴 공간에 있게 됩니다.
  • 하지만 한 줄이 너무 많다는 것을 기억하고 있으므로 s/\n//.
  • 바라보다! 줄 수는 끝의 빈 줄 수와 일치하므로(첫 번째 줄은 비어 있지 않지만 누가 신경쓰는지 참고) 이를 사용하여 계산할 수 있습니다 wc -l.

답변3

추가 GNU tac/ tail -r옵션:

tac file | awk 'NF{exit};END{print NR?NR-1:0}'

또는:

tac file | sed -n '/[^[:blank:]]/q;p' | wc -l

출력에서 다음을 참고하세요.

printf 'x\n '

즉, 마지막 전체 줄 뒤에 추가 공백이 있는 경우(일부는 추가 공백 줄로 간주할 수 있지만 POSIX 텍스트 정의에 따라 유효한 텍스트는 아님) 해당 공백은 0이 됩니다.

POSIX적으로:

awk 'NF{n=NR};END{print NR-n}' < file

그러나 이는 파일 전체를 읽는 것을 의미합니다( tail -r/는 tac검색 가능한 파일의 끝부터 파일을 거꾸로 읽습니다). 이는 1의 출력을 제공합니다 printf 'x\n '.

답변4

왜냐하면 당신이 실제로 요구하고 있기 때문입니다.grep해결책나는 이것을 GNU에만 의존하도록 추가합니다 grep(글쎄, 쉘 구문과 echo...도 사용합니다):

#!/bin/sh
echo $(( $(grep -c "" "$1") - $(grep -B$(grep -cv . "$1") . "$1" |grep -c "") ))

나는 여기서 뭘하고있는 거지? $(grep -c ".*" "$1")파일의 모든 줄 수를 계산한 다음 뒤에 오는 빈 줄 없이 파일을 뺍니다.

그리고 이것들을 얻는 방법은 무엇입니까? $(grep -B42 . "$1"비어 있지 않은 모든 줄과 그 앞의 42줄을 파악합니다. 따라서 비어 있지 않은 줄 앞에 42개 이하의 연속 빈 줄이 있는 한 공백이 아닌 마지막 줄까지 모든 것을 인쇄합니다. 이러한 제한을 피하기 위해 빈 줄의 총 개수를 $(grep -cv . "$1")옵션에 대한 인수로 전달하므로 항상 충분히 커집니다. -B이렇게 하면 뒤에 오는 빈 줄을 제거하고 이를 사용하여 |grep -c ".*"줄 수를 계산할 수 있습니다.

정말 멋지지 않나요? (-;

관련 정보