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
개행 문자로 각 출력 행을 종료하십시오. 문서에서는 찾을 수 없었고 방금 테스트했습니다.
이제 질문에 설명된 동작을 설명하기 위해 테스트를 실행할 수 있습니다.
- 후행 줄 바꿈 없이 3줄을 포함하는 테스트 파일을 만들어 보겠습니다.
echo -ne "first\nsecond\nthird" > 3lines.txt
- 마지막 문자를 확인해 보겠습니다.
tail -1 3lines.txt | od -c
음, "\n"은 없습니다.
wc -l < 3lines.txt
출력은 다음과 같습니다. 2(마지막 개행 문자가 누락되었기 때문에 마지막 줄은 계산되지 않습니다.)
- grep을 통해 모든 라인 전달
grep . < 3lines.txt | wc -l
출력은 3입니다(개행 문자가 손실되지 않으므로 모든 행이 계산됩니다).
- 하나의 행만 필터링합니다(모든 행 가능).
grep -v first < 3lines.txt | wc -l
출력은 2입니다(모든 행을 다시 계산함).