다음과 같은 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