파일의 텍스트 줄 수(구분되지 않은 텍스트 포함)를 계산하는 방법이 있습니까?

파일의 텍스트 줄 수(구분되지 않은 텍스트 포함)를 계산하는 방법이 있습니까?

POSIX wc명령은 파일의 POSIX 라인 수를 계산합니다. POSIX 표준은 다음을 정의합니다.철사접미사가 붙은 텍스트 문자열 \n. 그것이 없으면 \n일반 텍스트 문자열은 줄이라고 할 수 없습니다.

하지만 나에게는 파일에 몇 줄의 텍스트 문자열이 있는지 계산하는 것이 더 자연스럽게 느껴집니다. 이를 수행하는 쉬운 방법이 있습니까?

root:[~]# printf "aa\nbb" | wc -l
1
root:[~]# printf "aa\nbb\n" | wc -l
2
root:[~]#

답변1

GNU를 사용하면 sed다음을 사용할 수 있습니다.

sed '$=;d'

GNU는 sed마지막 줄 바꿈 뒤의 추가 문자를 추가 줄로 처리하기 때문입니다. 대부분의 GNU 유틸리티와 마찬가지로 GNU는 sed입력 시 NUL 문자를 지원하며 줄 길이에 제한이 없습니다(두 조건 모두 POSIX에 따라 입력을 텍스트가 아닌 것으로 만듭니다).

POSIXly 기반@Inian의 답변지나치게 긴 줄과 NUL 바이트를 지원합니다.

LC_ALL=C tr -cs '\n' '[x*]' | awk 'END {print NR}'

해당 tr명령은 개행 문자(디코딩 문제를 피하기 위해 각 바이트는 C 로케일의 문자로 해석됨)를 제외한 하나 이상의 문자로 구성된 모든 시퀀스를 다음으로 변환합니다.하나 x문자이므로 awk입력 레코드의 길이는 0 또는 1바이트가 되고 입력에는 x개행 문자만 포함됩니다.

$ printf '%10000s\na\0b\nc\nd' | wc -l
3

$ printf '%10000s\na\0b\nc\nd' | mawk 'END{print NR}'
2
$ printf '%10000s\na\0b\nc\nd' | busybox awk 'END{print NR}'
5
$ printf '%10000s\na\0b\nc\nd' | gawk 'END{print NR}'
4

$ printf '%10000s\na\0b\nc\nd' | LC_ALL=C tr -cs '\n' '[x*]' | mawk 'END{print NR}'
4

답변2

이를 사용할 수 있으며 파일 시작 부분부터 현재 레코드 수를 추적하는 awk특수 변수가 있습니다 . NR이 변수는 각 줄의 끝에서 증가됩니다. 블록에 인쇄할 때 END, 즉 모든 입력 라인을 처리한 후 마지막으로 처리된 레코드의 번호를 인쇄합니다.

printf "aa\nbb" | awk 'END { print NR }'
2

printf "aa\nbb\n" | awk 'END { print NR }'
2

관련 정보