두 파일에서 ID 열의 일치하는 데이터를 찾고 계산하는 방법은 무엇입니까?

두 파일에서 ID 열의 일치하는 데이터를 찾고 계산하는 방법은 무엇입니까?

염색체 위치 ID가 일치하는 두 개의 유전자 데이터세트가 있습니다. 파일 1의 염색체 위치 ID가 파일 2에 나타나는 횟수를 계산하고 싶습니다.

예를 들어 내 데이터는 다음과 같습니다.

파일 1(에서 제안한 대로 염색체 위치는 실제로 내 125번째 열입니다 ...):

Gene  pval    ... Chromosome position ID
ACE   0.002   ... 01:3290834_CT_C_1
NOS   0.01    ... 03:3304593_GA_G_1
BRCA  0.004 . ... 06:6265733_GA_G_1
CYP3  0.34    ... 09:9433933_GA_G_1

파일 2(염색체 위치가 첫 번째 열임):

Chromosome position ID  Gene  pval
01:1243933_GA_G_1       ACE   0.002
03:3304593_GA_G_1       NOS   0.01
06:6265733_GA_G_1       BRCA  0.004
09:9433933_GA_G_1       CYP3  0.34

일치하는 라인을 추출하는 것에 대한 많은 질문을 발견하고 그 질문을 기반으로 코드를 적용했지만 두 파일 사이에서 일치하는 염색체 위치의 개수만 얻고 싶습니다.

현재 나는 다음을 사용하고 있습니다 :

awk -F'|' 'NR==FNR{c[$125]++;next};c[$125]' file2.csv file1.txt > file3.txt

wc -l file1.txt
wc -l file3.txt

파일 1과 3의 행 수가 정확히 예상한 것과 다릅니다(파일 1의 모든 내용이 파일 2에 있기를 원했습니다). 무슨 일이 일어나고 있는지 확인하려면 일치 개수를 수행하는 방법을 찾아야 합니다. 염색체 위치 열은 OK입니다. "파일 1의 모든 염색체 위치가 파일 3에 일치/나타납니까?"를 인코딩하는 방법을 찾을 수 있다면 이상적일 것입니다. 그러나 지금은 단지 계산만 하면 됩니다.

따라서 출력은 파일 1의 염색체 위치 열 $125가 파일 2의 염색체 위치 열 $1과 일치하는 횟수를 세는 숫자가 됩니다.

저는 리눅스를 사용하고 있습니다.

답변1

awktail, sort및 가 포함된 join솔루션입니다 wc.

join <(awk -F '\t' '{print $125}' file1 | tail -n +2 | sort) <(awk -F '\t' '{print $1}' file2 | tail -n +2 | sort ) | wc -l
3

설명하다.

이 솔루션은 열이 탭으로 구분되어 있다고 가정합니다. awkfile1의 125번째 열과 file2의 첫 번째 열이 수집 됩니다. tail -n +2수집된 결과의 첫 번째 행을 삭제합니다. 체계적인 문서가 필요 sort하므로 필수입니다 . join결과 교차 세트가 wc여기에 공급되고 해당 라인 번호를 반환합니다.

답변2

당신은 가깝습니다. 노력하다

awk 'FNR == 1 {next}; FNR==NR {P[$125]; next} $1 in P {P[$1]++} END {for (p in P) print p, P[p]+0}' file[12]
03:3304593_GA_G_1 1
01:3290834_CT_C_1 0
09:9433933_GA_G_1 1
06:6265733_GA_G_1 1

분명히 file1의 모든 위치를 file2에서 찾을 수 있는 것은 아닙니다.

관련 정보