일부 줄은 관심이 있고 다른 줄은 관심이 없는 거대한 텍스트 파일을 구문 분석해야 합니다. 관심 있는 것 중에서 특정 키워드의 발생 횟수를 계산해야 합니다.
파일이 호출 input.txt
되고 다음과 같다고 가정합니다.
format300,format250,format300
format250,ignore,format160,format300,format300
format250,format250,format300
ignore
행을 제외 하고 개수를 계산하고 싶은데 format300
어떻게 해야 합니까?
지금까지 내가 얻은 것은 다음 명령입니다. 이 명령은 각 줄을 한 번만 계산합니다(충분하지 않습니다).
cat input.txt | grep -v ignore | grep 'format300' | wc -l
어떤 제안이 있으십니까? 가능하다면 Perl을 사용하지 않고 싶습니다.
답변1
이 줄은 당신이 원하는 것을 할 수 있어야 합니다:
grep -v ignore input.txt | sed 's/format300/format300\n/g' | grep -c "format300"
기본적으로 키워드의 각 항목을 키워드 자체와 줄 바꿈 문자로 바꾸면 효과적으로 입력 스트림이 주어진 행에서 키워드를 한 번만 갖게 됩니다. 그런 다음 grep -c
키워드가 포함된 행 수를 계산합니다.
답변2
첫 번째는 필요하지 않습니다 cat
.고양이의 불필요한 사용(UUOC).
또한 매우 유용하게도 grep -o
일치하는 패턴을 한 줄에 하나씩만 출력합니다.
그런 다음 로 행 수를 계산합니다 wc -l
.
grep -v ignore YOUR_FILE | grep -o format300 | wc -l
그러면 3
작은 샘플이 인쇄됩니다.
답변3
입력 파일에는 부분 일치가 포함되어 결과가 무효화될 수 있습니다. 예를 들면 다음과 같습니다.
1 format300,format250,format300
2 format250,ignore,format160,format300,format300
3 format250,format250,format300
4 format999,format300000,format999
5 format999,ignore_me_not,format300
4번째 줄 에 하위 문자열이 포함되어 있기 format300000
때문에 4번째 줄을 세거나 5번째 줄을 무시하고 싶지 않을 것입니다 .ignore_me_not
ignore
이렇게 하면 트릭을 수행할 수 있습니다.
grep -v "\bignore\b" FILE |grep -o "\bformat300\b"|wc -l
올바른 출력은
4
..2행이 무시되기 때문에 5행은 무시되지 않으며 4행은 완전히 포함되지 않습니다 format300
.
부품을 꺼내면 wc -l
정확히 일치하는 항목을 확인할 수 있습니다.
답변4
펄 방식:
perl -lne '$k+=(s/format300//g) unless /ignore/; }{ print $k' input.txt
s/format300//g
모든 항목을 null로 바꾸고 대체 format300
횟수를 반환합니다. 이는 발생 횟수를 계산하는 간단한 방법입니다. 그런 다음 숫자가 추가되고 $k
행이 일치하지 않는 경우에만 모든 일이 발생합니다 ignore
. 이것은 }{
"파일을 읽은 후 이 작업을 수행하면 print $k
발견된 총 개수가 인쇄됩니다"에 대한 Perl 약어입니다.