grep 또는 sed를 사용하여 파일에서 줄을 제거하지만 여전히 줄 수는 동일합니다.

grep 또는 sed를 사용하여 파일에서 줄을 제거하지만 여전히 줄 수는 동일합니다.

grep -v 또는 sed를 사용하여 파일에서 한 줄을 삭제하려고 하는데 문제는 삭제 후에도 결과의 줄 수가 동일하게 유지된다는 것입니다.

$ grep $'\t59116613\t' ../chr/19.TB0002183.all.vcf 
19      59116613        .       T       C       20.3144 .       DP=42;VDB=0.566336;SGB=-0.651104;RPB=0.504878;MQB=0.0279668;MQSB=0.943468;BQB=0.362091;MQ0F=0;ICB=1;HOB=0.5;AC=1;AN=2;DP4=21,13,2

$ grep -v $'\t59116613\t' ../chr/19.TB0002183.all.vcf | wc -l
108067

$ wc -l ../chr/19.TB0002183.all.vcf 
108067

답변1

줄 계산이 예상치 못한 결과를 낳는 경우 각 텍스트 처리 유틸리티가 동일한 방식으로 줄의 의미를 이해하는지 확인해야 합니다. 이는 일반적으로 두 가지 질문으로 귀결됩니다.

1) 파일 변환 문제: EOL(줄 끝, 줄 바꿈 또는 줄 바꿈 문자라고도 함)로 사용되는 문자는 무엇입니까? 운영 체제에 따라 \r, \n또는 가 될 수 있습니다 .\r\n

2) 마지막 줄도 EOL로 끝나나요? 그렇지 않은 경우 텍스트 처리 유틸리티는 이를 어떻게 처리합니까?

이 경우 두 번째 질문이 설명으로 이어집니다.

어떤 종류의 wc -l?

매뉴얼 페이지에서 직접:

-l, --lines 줄 바꿈 수를 인쇄합니다.

분명히 마지막 줄이 개행으로 끝나지 않으면 마지막 줄은 계산되지 않습니다. 즉, 결과는 실제 줄 수보다 1 적습니다.

무엇이 생산되나요 grep?

grep개행 문자로 각 출력 행을 종료하십시오. 문서에서는 찾을 수 없었고 방금 테스트했습니다.


이제 질문에 설명된 동작을 설명하기 위해 테스트를 실행할 수 있습니다.

  1. 후행 줄 바꿈 없이 3줄을 포함하는 테스트 파일을 만들어 보겠습니다.

echo -ne "first\nsecond\nthird" > 3lines.txt

  1. 마지막 문자를 확인해 보겠습니다.

tail -1 3lines.txt | od -c

음, "\n"은 없습니다.

  1. wc -l < 3lines.txt

출력은 다음과 같습니다. 2(마지막 개행 문자가 누락되었기 때문에 마지막 줄은 계산되지 않습니다.)

  1. grep을 통해 모든 라인 전달

grep . < 3lines.txt | wc -l

출력은 3입니다(개행 문자가 손실되지 않으므로 모든 행이 계산됩니다).

  1. 하나의 행만 필터링합니다(모든 행 가능).

grep -v first < 3lines.txt | wc -l

출력은 2입니다(모든 행을 다시 계산함).

관련 정보