다양한 파일을 받았는데 그 중 일부에는 \r
, \n
및 로 끝나는 줄이 있다고 가정해 보겠습니다 \r\n
. 무슨 일이 일어날지 미리 알 수 없는 경우 파일의 줄 수를 어떻게 효율적으로 계산할 수 있습니까?
wc -l
분명히 이것은 Mac 라인 엔딩이 있으면 작동하지 않습니다.
Grep을 사용하면 매우 부정확한 것으로 보입니다.
grep -o '\r' /path/to/file.txt | wc -l
1041줄이 주어지는데 실제로는 299줄밖에 안되는데, nano
이는 Mac포맷에서 자동변환을 통해 확인할 수 있다.
grep -o '[\r\n]+' /path/to/file.txt | wc -l
또한 반환 횟수가 0 이므로 내가 기대했던 다양성을 제공하지 않습니다 .
이 작업을 올바르게 수행하려면 어떻게 해야 합니까?
답변1
귀하의 명령은 다음을 사용하여 grep
너무 많은 일치 항목을 제공합니다.grep
기본 정규식, 특별한 의미가 부여되지 않은 \r
문자 "r"의 발생 횟수를 계산합니다.
tr
하다모든 일치 항목을 찾아 바이트별로 계산 하도록 \n
합계를 식별합니다 .\r
wc -c
tr -d -c '\n\r' < file.txt | wc -c
그러나 파일에 Windows/DOS 줄 종결자( \r\n
)가 포함될 수도 있으므로 이러한 줄 종결자는 두 번 계산됩니다. DOS 스타일 줄 끝을 다른 형식 중 하나로 변환한 다음 이전과 같이 개별 줄 끝을 계산하려면 추가 단계가 필요합니다.
sed 's/\r$//' file.txt | tr -d -c '\n\r' | wc -c
sed
안타깝게도 둘 중 하나를 식별하는 것이 항상 가능한 것은 아닙니다 \r
. 쉘 자체 이스케이프, 명령 echo
또는 sed 스크립트를 파일에 넣는 것과 같은 캐리지 리턴을 지정하는 다른 방법을 사용해야 할 수도 있습니다.
답변2
gawk 'END {print NR}' RS='\r|\n|\r\n' file.txt
이 RS
변수는 개행 문자로 간주되는 항목( gawk
이 경우 정규식)을 지정합니다.