grep을 실행하고 파일 1의 패턴이 파일 2에서 나타나는 횟수를 인쇄합니다.

grep을 실행하고 파일 1의 패턴이 파일 2에서 나타나는 횟수를 인쇄합니다.

다음과 같은 file1(내 패턴 목록)이 있습니다.

파일 1

Fatty_acid_degradation
Aminobenzoate_degradation
Amino_sugar_and_nucleotide_sugar_metabolism
Amoebiasis

나는 file2(모든 패턴 목록)를 가지고 있습니다.

파일 2

Fatty_acid_degradation
Fatty_acid_degradation
Fatty_acid_degradation
Bacterial_invasion_of_epithelial_cells
Bacterial_invasion_of_epithelial_cells
Bacterial_invasion_of_epithelial_cells
Bacterial_invasion_of_epithelial_cells

file1의 각 패턴이 file2에 나타나는 횟수를 grep하고 계산하여 다음과 같은 테이블(탭으로 구분)을 얻고 싶습니다.

Fatty_acid_degradation 3

답변1

가장 간단한 방법은 grep각 패턴을 세어 계산하는 것입니다.

$ grep -Fwf file1 file2 | sort | uniq -c
      3 Fatty_acid_degradation

옵션 grep-f검색할 패턴 목록으로 파일을 제공하고, -F패턴이 정규 표현식이 아닌 문자열로 처리되어야 함을 지정하고, -w패턴이 전체 단어만 일치하는지 확인하는 것입니다(따라서 반대와 regulation_of_expression일치하지 않음 ). upregulation_of_excpression.

그런 다음 원하는 도구를 사용하여 형식을 변경할 수 있습니다.

$ grep -Fwf file1 file2 | sort | uniq -c | sed -r 's/.*([0-9]+) *(.*)/\2\t\1/'
$ grep -Fwf file1 file2 | sort | uniq -c | perl -lane 'print "$F[1]\t$F[0]"'
$ grep -Fwf file1 file2 | sort | uniq -c | awk -vOFS="\t" '{print $2,$1}'

위 항목을 모두 반환하세요.

Fatty_acid_degradation  3

답변2

grep -f file1 file2 | sort | uniq -c

그러면 다음 형식으로 출력이 제공됩니다.

  3 Fatty_acid_degradation

견딜 수 있나요?

답변3

답변이 너무 많아서 당황스럽네요...

awk 'FNR == NR { pat[$1]=0 ; next ; }
{ if ( $0 in pat ) pat[$0]++ ; }
END { for ( p in pat ) if ( pat[p]) printf "%s %d\n",p,pat[p] ;}' f1 f2

어디

  • FNR == NR { pat[$1]=0 ; next ; }Pat 배열에 패턴 기록
  • { if ( $0 in pat ) pat[$0]++ ; }일치하는 항목이 있을 때마다 계산
  • END { for ( p in pat ) if ( pat[p]) printf "%s %d\n",p,pat[p] ;}마지막으로 0이 아닌 개수를 덤프합니다.

답변4

Python을 사용하여 다음 솔루션을 시도해 볼 수도 있습니다.

#!/usr/bin/env python2
import collections
with open('file_1') as f1, open('file_2') as f2:
    counts = collections.Counter(f2)
    for line in f1:
        if line in counts:
            print line.rstrip() + '\t' + str(counts[line])

여기서 우리는 iterable에서 각 요소의 발생 횟수를 포함하는 사전을 생성하는 모듈 Counter의 클래스를 사용했습니다.collections

관련 정보