grep을 사용하여 파일의 패턴을 처리하고 각 패턴의 발생 횟수를 얻으려면 어떻게 해야 합니까?

grep을 사용하여 파일의 패턴을 처리하고 각 패턴의 발생 횟수를 얻으려면 어떻게 해야 합니까?

fileA.txt의 패턴과 함께 grep을 사용하고 fileB.tab에서 찾는 방법을 알아내려고 합니다. 내가 원하는 결과는 fileB.tab의 각 패턴 발생 횟수입니다.

나는 시도했다:

grep -f FileA.txt FileB.tab | wc -l

하지만 이것이 fileA.tab 패턴이 발생하는 FileB.tab의 모든 줄을 반환한다고 생각합니다.

답변1

patterns파일에 고정 문자열만 포함된 경우 gnu설정에서 다음을 수행할 수 있습니다.

grep -oFf patterns infile | sort | uniq -c

내용이 정규식이라면 다음과 같을 것입니다.

sed -E 'h;s|/|\\&|g;x;s|[\&/]|\\&|g;H;x;s|(.*)\n(.*)|s/\1/\2/|' patterns \
| sed -f - <(grep -of patterns infile)  | sort | uniq -c

즉, grep이번만 동일한 명령을 사용하여 결과를 처리하여 sed일치 항목이 실제 패턴으로 대체되도록 합니다( sed콘텐츠를 기반으로 하는 다른 스크립트를 통해 patterns).

답변2

uniq에는 발생 횟수를 계산하는 옵션이 있습니다.

grep -f fileA.txt fileB.txt | uniq -c

그러나 fileA에 중복 항목이 있으면 해당 항목을 찾기 위해 여러 번 grep을 수행하므로 개수가 올바르지 않게 됩니다. 이 경우 fileA는 먼저 uniq를 통해 실행되어 중복 항목을 제거한 다음 패턴에 사용됩니다.

새 파일로 필터링하거나 파일을 한 줄씩 처리하고 거기에서 실행할 수 있습니다.

while read keyword; do grep $keyword fileB.txt; done < fileA.txt | uniq -c

관련 정보