Como dividir um único arquivo em múltiplos arquivos baseados em uma coluna no linux?

0

Eu tenho um arquivo de texto com as seguintes informações:

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

Como você vê, há vários exemplos que eu quero dividir o arquivo em vários arquivos com base na coluna "Tumor_Sample_Barcode". Os arquivos de saída precisam ser nomeados com samplename.txt.

Primeira saída - 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

Segunda saída - 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

Terceira saída - 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

Como fazer este linux?

    
por user3351523 31.01.2018 / 13:41

1 resposta

3

Awk solução:

awk 'NR==1{ h=$0 }NR>1{ print (!a[$2]++? h ORS $0 : $0) > $2".txt" }' file
  • NR==1{ h=$0 } - captura a primeira linha / registro como linha cabeçalho ( NR aponta para um número de registro, $0 - contém a linha atual)
  • NR > 1 - para todos os registros, exceto o primeiro:
    • <cond>? <operand_1> : <operand_2> - operador ternário clássico
    • !a[$2]++? - verificar a primeira ocorrência do valor do código de barras $2 usado como chave da matriz associativa a
    • h ORS $0 - linha de cabeçalho comum concatenada com ORS (separador de registro de saída, padrão \n ) e registro atual $0
    • print ... > $2".txt" - imprime o conteúdo personalizado ou a linha atual (se nada tiver sido especificado) no arquivo <barcode_value>.txt

Ou uma versão mais autoexplicativa:

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

Visualizando resultados:

$ 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

Para ajustar um nome de arquivo com base na sequência de 15 caracteres do valor código de barras :

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