awk manipulação de um arquivo

0

Eu tenho um arquivo que é a saída de vários comandos canalizados. Algo parecido com isto

command1 input.txt| command2 | command3 | input file

O arquivo é separado por guias

Após o comando 3, meu arquivo de entrada se parece com isso

chr6    116732135   116741866   116732135   116732368   116741505   116741866   +   0.79    0.51    0.97    0.77    0.48    0.97    0.02    0.37    'chr6:116732136-116732368:+@chr6:116741506-116741866:+.A.withRI','chr6:116732136-116732368:+@chr6:116741506-116741866:+.B.up_chr6:116732136-116732368:+@chr6:116741506-116741866:+.B.dn'    (0,0):10,(1,0):147,(1,1):1  0:148   (0,0):36,(1,0):161,(1,1):3  0:163,1:1   chr6    +   116732136,116732136 116741866,116741866 gene_id "ENSG00000196911.10"; transcript_id "ENST00000368564.6"; gene_type "protein_coding"; gene_name "KPNA5"; transcript_type "protein_coding"; transcript_name "KPNA5-202"; level 2; protein_id "ENSP00000357552.1"; transcript_support_level "1"; tag "basic"; tag "appris_principal_1"; tag "CCDS"; ccdsid "CCDS5111.1"; havana_gene "OTTHUMG00000015448.4"; havana_transcript "OTTHUMT00000041967.2";
chr6    116732135   116741866   116732135   116732368   116741505   116741866   +   0.79    0.51    0.97    0.77    0.48    0.97    0.02    0.37    'chr6:116732136-116732368:+@chr6:116741506-116741866:+.A.withRI','chr6:116732136-116732368:+@chr6:116741506-116741866:+.B.up_chr6:116732136-116732368:+@chr6:116741506-116741866:+.B.dn'    (0,0):10,(1,0):147,(1,1):1  0:148   (0,0):36,(1,0):161,(1,1):3  0:163,1:1   chr6    +   116732136,116732136 116741866,116741866 gene_id "ENSG00000196911.10"; transcript_id "ENST00000356348.6"; gene_type "protein_coding"; gene_name "KPNA5"; transcript_type "protein_coding"; transcript_name "KPNA5-201"; level 2; protein_id "ENSP00000348704.1"; transcript_support_level "1"; tag "basic"; tag "appris_principal_1"; tag "CCDS"; ccdsid "CCDS5111.1"; havana_gene "OTTHUMG00000015448.4"; havana_transcript "OTTHUMT00000041969.2";

Após o comando 3, usei o comando awk para dividir a última coluna usando ; Este é o comando

command1 input.txt| command2 | command3 | awk -F "\t" -v OFS="\t" '{split($NF,a,";"); $NF=""; print $0,a[1],a[4]}'

Eu queria dividir no último campo do arquivo obtido a partir do comando3 e, em seguida, imprimir todos os campos, exceto último campo e, em seguida, um [1] e um [4], os campos de divisão, mas isso adiciona uma guia entre colunas 1 -25 e um [1], um [4]. Como posso evitar isso?

Obrigado

e esta é a saída

chr6    116732135   116741866   116732135   116732368   116741505   116741866   +   0.79    0.51    0.97    0.77    0.48    0.97    0.02    0.37    'chr6:116732136-116732368:+@chr6:116741506-116741866:+.A.withRI','chr6:116732136-116732368:+@chr6:116741506-116741866:+.B.up_chr6:116732136-116732368:+@chr6:116741506-116741866:+.B.dn'    (0,0):10,(1,0):147,(1,1):1  0:148   (0,0):36,(1,0):161,(1,1):3  0:163,1:1   chr6    +   116732136,116732136 116741866,116741866     gene_id "ENSG00000196911.10"     gene_name "KPNA5"
chr6    116732135   116741866   116732135   116732368   116741505   116741866   +   0.79    0.51    0.97    0.77    0.48    0.97    0.02    0.37    'chr6:116732136-116732368:+@chr6:116741506-116741866:+.A.withRI','chr6:116732136-116732368:+@chr6:116741506-116741866:+.B.up_chr6:116732136-116732368:+@chr6:116741506-116741866:+.B.dn'    (0,0):10,(1,0):147,(1,1):1  0:148   (0,0):36,(1,0):161,(1,1):3  0:163,1:1   chr6    +   116732136,116732136 116741866,116741866     gene_id "ENSG00000196911.10"     gene_name "KPNA5"
    
por user3138373 15.08.2018 / 01:23

1 resposta

2

Então, dado

$ printf 'foo\tbar\ta;b;c;d' | 
    awk -F "\t" -v OFS="\t" '{split($NF,a,";"); $NF=""; print $0,a[1],a[4]}' | cat -A
foo^Ibar^I^Ia^Id$

(onde eu estou usando cat -A para exibir as abas como ^I para facilitar a visualização) você quer eliminar a aba dupla?

Nesse caso, uma maneira seria decrementar NF em vez de atribuir a string vazia a $NF :

$ printf 'foo\tbar\ta;b;c;d' | 
    awk -F "\t" -v OFS="\t" '{split($NF,a,";"); NF--; print $0,a[1],a[4]}' | cat -A
foo^Ibar^Ia^Id$

Outra forma seria concatenar as strings em vez de imprimi-las como campos. Você pode fazer isso removendo , entre elas:

$ printf 'foo\tbar\ta;b;c;d' | 
    awk -F "\t" -v OFS="\t" '{split($NF,a,";"); $NF=""; print $0 a[1],a[4]}' | cat -A
foo^Ibar^Ia^Id$
    
por 15.08.2018 / 01:41

Tags