Linux의 열을 기반으로 단일 파일을 여러 파일로 분할하는 방법은 무엇입니까?

Linux의 열을 기반으로 단일 파일을 여러 파일로 분할하는 방법은 무엇입니까?

다음 정보가 포함된 텍스트 파일이 있습니다.

Hugo_Symbol Tumor_Sample_Barcode    Entrez_Gene_Id  Center  NCBI_Build
MTHFR   TCGA-BD-A2L6-01A-11D-A20W-10    4524    BCM GRCh38
SLC30A1 TCGA-BD-A2L6-01A-11D-A20W-10    7779    BCM GRCh38
USH2A   TCGA-BD-A2L6-01A-11D-A20W-10    7399    BCM GRCh38
SOS1    TCGA-BD-A2L6-01A-11D-A20W-10    6654    BCM GRCh38
TMEM51  TCGA-O8-A75V-01A-11D-A32G-10    55092   BCM GRCh38
FLG TCGA-O8-A75V-01A-11D-A32G-10    2312    BCM GRCh38
FLG TCGA-O8-A75V-01A-11D-A32G-10    2312    BCM GRCh38
PRDM16  TCGA-G3-A7M5-01A-11D-A33Q-10    63976   BCM GRCh38
DNAJC11 TCGA-G3-A7M5-01A-11D-A33Q-10    55735   BCM GRCh38
HNRNPCL2    TCGA-G3-A7M5-01A-11D-A33Q-10    440563  BCM GRCh38
C1orf94 TCGA-G3-A7M5-01A-11D-A33Q-10    84970   BCM GRCh38
NFYC    TCGA-G3-A7M5-01A-11D-A33Q-10    4802    BCM GRCh38
IPP TCGA-G3-A7M5-01A-11D-A33Q-10    3652    BCM GRCh38

보시다시피 여러 샘플이 있으며 "Tumor_Sample_Barcode" 열을 기반으로 파일을 여러 파일로 분할하고 싶습니다. 출력 파일의 이름은 Samplename.txt로 지정되어야 합니다.

첫 번째 출력 - TCGA-BD-A2L6-01A-11D-A20W-10.txt

Hugo_Symbol Tumor_Sample_Barcode    Entrez_Gene_Id  Center  NCBI_Build
MTHFR   TCGA-BD-A2L6-01A-11D-A20W-10    4524    BCM GRCh38
SLC30A1 TCGA-BD-A2L6-01A-11D-A20W-10    7779    BCM GRCh38
USH2A   TCGA-BD-A2L6-01A-11D-A20W-10    7399    BCM GRCh38
SOS1    TCGA-BD-A2L6-01A-11D-A20W-10    6654    BCM GRCh38

두 번째 출력 - TCGA-O8-A75V-01A-11D-A32G-10.txt

Hugo_Symbol Tumor_Sample_Barcode    Entrez_Gene_Id  Center  NCBI_Build
TMEM51  TCGA-O8-A75V-01A-11D-A32G-10    55092   BCM GRCh38
FLG TCGA-O8-A75V-01A-11D-A32G-10    2312    BCM GRCh38
FLG TCGA-O8-A75V-01A-11D-A32G-10    2312    BCM GRCh38

세 번째 출력 - TCGA-G3-A7M5-01A-11D-A33Q-10.txt

Hugo_Symbol Tumor_Sample_Barcode    Entrez_Gene_Id  Center  NCBI_Build
PRDM16  TCGA-G3-A7M5-01A-11D-A33Q-10    63976   BCM GRCh38
DNAJC11 TCGA-G3-A7M5-01A-11D-A33Q-10    55735   BCM GRCh38
HNRNPCL2    TCGA-G3-A7M5-01A-11D-A33Q-10    440563  BCM GRCh38
C1orf94 TCGA-G3-A7M5-01A-11D-A33Q-10    84970   BCM GRCh38
NFYC    TCGA-G3-A7M5-01A-11D-A33Q-10    4802    BCM GRCh38
IPP TCGA-G3-A7M5-01A-11D-A33Q-10    3652    BCM GRCh38

이 리눅스로 무엇을 해야 할까요?

답변1

Awk해결책:

awk 'NR==1{ h=$0 }NR>1{ print (!a[$2]++? h ORS $0 : $0) > $2".txt" }' file
  • NR==1{ h=$0 }- 첫 번째 줄 캡처/다음으로 기록머리글line( NR레코드 번호를 가리키고 $0-현재 줄을 포함함)
  • NR > 1- 첫 번째 기록을 제외한 모든 기록의 경우:
    • <cond>? <operand_1> : <operand_2>- 고전적인 삼항 연산자
    • !a[$2]++?- 최초 발생 여부 확인바코드$2연관 배열의 키로 사용되는 값a
    • h ORS $0ORS- (출력 레코드 구분 기호, 기본값 \n) 및 현재 레코드 와 연결된 공통 헤더 행$0
    • print ... > $2".txt"- 사용자 정의 콘텐츠 또는 현재 줄(아무 것도 지정하지 않은 경우)을 파일로 인쇄합니다.<barcode_value>.txt

또는 좀 더 설명이 필요한 버전은 다음과 같습니다.

awk 'NR==1 {header = $0; next}
     !header_printed[$2]++ {print header > $2".txt"}
     {print > $2".txt"}' < file

결과 보기:

$ head TCGA*.txt
==> TCGA-BD-A2L6-01A-11D-A20W-10.txt <==
Hugo_Symbol Tumor_Sample_Barcode    Entrez_Gene_Id  Center  NCBI_Build
MTHFR   TCGA-BD-A2L6-01A-11D-A20W-10    4524    BCM GRCh38
SLC30A1 TCGA-BD-A2L6-01A-11D-A20W-10    7779    BCM GRCh38
USH2A   TCGA-BD-A2L6-01A-11D-A20W-10    7399    BCM GRCh38
SOS1    TCGA-BD-A2L6-01A-11D-A20W-10    6654    BCM GRCh38

==> TCGA-G3-A7M5-01A-11D-A33Q-10.txt <==
Hugo_Symbol Tumor_Sample_Barcode    Entrez_Gene_Id  Center  NCBI_Build
PRDM16  TCGA-G3-A7M5-01A-11D-A33Q-10    63976   BCM GRCh38
DNAJC11 TCGA-G3-A7M5-01A-11D-A33Q-10    55735   BCM GRCh38
HNRNPCL2    TCGA-G3-A7M5-01A-11D-A33Q-10    440563  BCM GRCh38
C1orf94 TCGA-G3-A7M5-01A-11D-A33Q-10    84970   BCM GRCh38
NFYC    TCGA-G3-A7M5-01A-11D-A33Q-10    4802    BCM GRCh38
IPP TCGA-G3-A7M5-01A-11D-A33Q-10    3652    BCM GRCh38

==> TCGA-O8-A75V-01A-11D-A32G-10.txt <==
Hugo_Symbol Tumor_Sample_Barcode    Entrez_Gene_Id  Center  NCBI_Build
TMEM51  TCGA-O8-A75V-01A-11D-A32G-10    55092   BCM GRCh38
FLG TCGA-O8-A75V-01A-11D-A32G-10    2312    BCM GRCh38
FLG TCGA-O8-A75V-01A-11D-A32G-10    2312    BCM GRCh38

15자의 순서를 기준으로 파일 이름을 조정합니다.바코드값:

awk 'NR==1{ h=$0 }NR>1{ print (!a[$2]++? h ORS $0 : $0) > substr($2, 1, 15)".txt" }' file 

관련 정보