파일 끝에 빈 줄이 있는 파일이 있습니다. 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 ".*"
줄 수를 계산할 수 있습니다.
정말 멋지지 않나요? (-;