
파일 끝에 빈 줄이 있는 파일이 있습니다. 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
. 다음 빈 라인이 추가되면 예상대로 다시 2개가 됩니다.$!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 ".*"
줄 수를 계산하는 데 사용할 수 있습니다.
훌륭하지 않나요? (-;