5개의 열을 사용하여 파일의 하위 집합 추출

5개의 열을 사용하여 파일의 하위 집합 추출

2개의 파일이 있습니다. 하나는 biiiiig 파일(249430줄)이고 다른 하나는 첫 번째 파일(500줄)보다 작습니다.

첫 번째 파일에는 이 5개의 열과 다른 열(두 번째 파일의 처음 5개 열과 동일)이 있습니다.

#CHROM     POS         ID          REF      ALT     QUAL    INFO 
chr2       32424454        rs4576493      T       G       pass    ......
chr8       35578788        rs3686678      C       A        pass .........
chr8       35578788        rs3686678      C       CCG      pass .........
chrx       35578788        rs3686678      C       CCG      pass .........

두 번째 파일에는 5개의 열이 있습니다. 예를 들면 다음과 같습니다.

#CHROM     POS         ID          REF      ALT
chr2       32424454        rs4576493      T       G
chr8       35578788        rs3686678      C       CCG

두 번째 파일의 다섯 번째 열을 첫 번째 파일과 비교한 다음 파일 사이의 교차 행만 저장하고 싶습니다(그러나 파일 1의 모든 열은 포함).

그래서 제가 원하는 최종 파일은 다음과 같습니다

#CHROM     POS         ID          REF      ALT     QUAL    INFO 
chr2       32424454        rs4576493      T       G       pass    ......
chr8       35578788        rs3686678      C       CCG      pass .........

유닉스에서는 무엇을 해야 합니까? 감사해요

답변1

awk를 사용하십시오.

awk '
    { key = $1 FS $2 FS $3 FS $4 FS $5 }
    NR==FNR { a[key]; next }
    key in a
' file2 file1

답변2

두 파일이 모두 TSV 파일, 즉 탭으로 구분된 파일이라고 가정하면 다음을 사용할 수 있습니다.밀러( mlr; 구조화된 데이터 작업을 위해 특별히 개발된 도구)는 언급한 5개 필드를 사용하여 두 데이터 세트 간의 관계형 INNER JOIN 작업을 수행합니다.

$ mlr --tsv join -f firstfile -j '#CHROM,POS,ID,REF,ALT' secondfile
#CHROM  POS     ID      REF     ALT     QUAL    INFO
chr2    32424454        rs4576493       T       G       pass    ......
chr8    35578788        rs3686678       C       CCG     pass    .........

데이터가 단일 탭 대신 여러 공백을 사용하는 경우 입력과 출력이 모두 "예쁘게 인쇄"되기를 원함을 나타내기 --pprint위해 대신 사용하십시오. (또는 및 )를 --tsv사용하여 입력을 "예쁜 인쇄" 형식으로 읽고 출력을 TSV로 씁니다.--p2t--ipprint--otsv

관련 정보