파일의 행 수를 읽는 wc 명령에 오류가 발생했습니다.

파일의 행 수를 읽는 wc 명령에 오류가 발생했습니다.

wc -l내 파일에 존재하는 줄 수를 확인하는 데 사용되었습니다 . 항상 잘 작동했지만 이번에는 그렇지 않았습니다.

나는 각 파일에 적어도 두 줄이 있어야 하는 120개의 큰 파일을 가지고 있습니다. 방금 해당 파일에 대한 일부 텍스트 편집 작업을 수행하여 새 줄을 제거하고 추가했습니다. wc -l *평소대로 사용하여 최종 줄 수를 확인하려고했습니다 . 출력 결과 대부분의 파일에 한 줄만 있는 것으로 나타났습니다.

파일 중 하나(명령 결과에 한 줄만 있음)를 열었고 vim정확히 두 줄이 있음을 알 수 있습니다. 종료 vim하고 를 사용하여 다시 확인하면 wc -l해당 파일의 줄 수가 2로 나타납니다.

여기서 무슨 일이 일어났는지 아는 사람 있나요? 120개의 파일을 모두 여는 대신 이 문제를 어떻게 해결할 수 있습니까 vim?

추신: 내 파일의 마지막 줄은 비어 있지 않았습니다.

답변1

일반적인 Gnu 구현은 다음과 wc같습니다.

'wc'는 주어진 각 FILE의 바이트, 문자, 공백으로 구분된 단어
및 개행의 수를 셉니다. 또는 표준 입력이 주어지지 않거나 '-'인 경우 표준 입력의 수를 셉니다.

따라서 파일에 최종 개행 문자가 없으면 출력의 "줄" 부분은 wc예상보다 1이 적습니다. 예를 들어 다음은 1을 출력합니다.

printf 'hello\nworld' | wc -l 

OP는 vim이 최종 개행 문자가 부족하다고 보고하고 있다는 의견을 통해 확인했습니다. 모든 파일에 이 문제가 있는 것으로 알려진 경우 간단한 수정 방법은 다음과 같습니다.

 for f in *
 do
     echo >> "$f"
 done

각 파일에 개행 문자를 추가합니다.

파일이 누락된 경우 모든 파일 끝에 조건부로 개행 문자를 추가하는 방법은 sed를 사용하는 것입니다.

sed -s -i '$s/$/\n/;P;d' *

일부 GNU 확장을 사용하여 -s각 파일을 개별적으로 처리하고 -i내부 편집을 수행하며 \n개행을 표시할 수 있습니다. sed 프로그램 자체는 각 파일의 마지막 줄에 개행을 추가하고 각 줄에 대해 첫 번째 개행까지 인쇄하고 다음 줄로 이동한다고 말합니다.

답변2

이것은 정확한 대답은 아니지만 텍스트 파일을 정규화하기 위해 자주 사용하는 마이크로 개인 도구(txtnorm)를 공유합니다.

#!/usr/bin/perl -spi
our($s);
s/\n\r|\r\n|\n|\r/\n/g;                 ## normalize \n
s/^(\xFF\xFE|\xFE\xFF|\xEF\xBB\xBF)//;  ## remove BOM !
s/(?<=.)\z/\n/;                         ## ensure newline at eof

if($s){ s/\xC2\xA0/ /g }                ## -s non breaking spaces-> " "

txtnorm *.txt줄 끝을 정규화하고, eof에서 줄 바꿈을 보장하고, BOM을 제거하고, -s를 사용하여 잘림 방지 공백을 정규화할 수 있습니다.

반드시 텍스트 파일에만 사용하세요.

관련 정보