Primeiros dois campos a serem separados por _ e resto dos campos como eles são

3
#CHROM  POS     REF     ALT     ../S101_sorted.bam      ../S102_sorted.bam          ../S105_sorted.bam      ../S107_sorted.bam      ../S113_sorted.bam      ../S114_sorted.bam      ../S115_sorted.bam      ../S
Aradu.A01       296611  T       C       T       T       T       T       T       T       T       T       T       T       T       T       T       T       T/C     T       T/C     T       T       T       T
Aradu.A01       326689  T       C       T/C     T       T       T       T/C     T       T       T       T/C     T/C     T       T       T       T       T       T       T       T/C     T/C     T       T
Aradu.A01       615910  T       G       T       T       T       T       T       T       T       T       T       T       T       T       T       T       T       T       T       T       T       T       T
Aradu.A01       661394  T       A       T       T       T       T       T       T/A     T       T       T       T       T       T       T       T       T       T       T       T       T       T       T
Aradu.A01       941674  C       T       C       C/T     C       C       C/T     C       C       C       C       C       C       C       C       C       C       C       C       C       C       C       C
Aradu.A01       942064  C       T       C/T     C/T     C/T     C/T     C/T     C       C       C/T     C       C/T     C/T     C       C       C/T     C/T     C       C       C       C       C/T     C/T
Aradu.A01       954858  G       A       G/A     G       G       G       G       G       G       G       G       G       G       G       G       G       G       G       G/A     G       G       G       G
Aradu.A01       1196780 C       A       C/A     C       C       C       C       C       C       C       C       C       C       C/A     C       C       C/A     C       C       C       C       C       C

Eu tenho um arquivo no formato acima e estou tentando imprimir as duas primeiras colunas separadas por _ e o restante das colunas como elas são. Eu tentei o seguinte porca de script awk não retorna qualquer saída.

awk '{if (NR>1) print $1"_"$2; for(i=3;i<NF;i++) printf "\t", $i}' input_file > out_file.

Alguém pode sugerir o que estou fazendo de errado aqui?

    
por gaurav agarwal 12.01.2017 / 21:51

4 respostas

7

Para alterar o espaço em branco entre as duas primeiras colunas para um sublinhado, sugiro sed :

 sed -e 's/[\t ]\+/_/'

E se você precisar ignorar a linha de cabeçalho:

sed -e '/^#/! s/[\t ]\+/_/'

ou, para o caso mais geral (o cabeçalho pode começar com qualquer caractere; \t funciona apenas com gnu sed )

sed -E '1! s/[[:blank:]]+/_/'

Quanto à pergunta sobre seu código awk , o primeiro print deve ser um printf para não imprimir uma nova linha de tempo incorreta.

    
por 12.01.2017 / 21:58
3

A partir do seu código, isso deve fornecer a saída desejada:

awk ' NR>1 { 
             printf( $1"_"$2 ); 
             for (i=3;i<NF;i++) printf("\t%s", $i); 
             printf("\n") 
           } 
      NR==1 { print } ' input > output  
    
por 12.01.2017 / 22:07
1

Isso parece funcionar:

awk '{ if(NR>1) { printf $1"_"$2; for(i=3;i<NF;i++) {printf "\t"$i } } print "" }' input
    
por 12.01.2017 / 22:08
1

Aqui está um pequeno script do Python 3, que faz o trabalho. A premissa subjacente aqui é ler cada caractere de linha por caractere, usar duas variáveis - uma que controla se os sublinhados da coluna da primeira para a segunda foram escritos e outra - que controla se podemos substituir o espaço pelo sublinhado.

Eu notei no formato de arquivo de entrada do OP que a segunda coluna é todos os valores numéricos. Assim, podemos começar com a permissão de espaços serem substituídos por sublinhados, mas uma vez que escrevemos sublinhados e encontramos um caractere numérico (ambas as condições são verdadeiras), podemos desativar a variável write_ok , e os outros espaços serão impresso como de costume.

#!/usr/bin/env python3
import sys
import os

def count_first_spaces(string):
    write_ok = True
    underscores_ok = False 

    for char in string:
        if char == " " and write_ok:
           print("_",end="")
           underscores_ok = True
           continue
        if underscores_ok  and char.isdigit():
           write_ok = False
        print(char,end="")
    print("") # add newline 

def main():
    if not os.path.isfile(sys.argv[1]): sys.exit(1)
    with open(sys.argv[1]) as fd:
        for line in fd:
            if line.startswith('#'): print(line.strip())
            else: count_first_spaces(line.strip()) 

if __name__ == '__main__': main()            

E aqui está o teste:

$ ./add_underscore.py  input.txt                                                                                         
#CHROM  POS     REF     ALT     ../S101_sorted.bam      ../S102_sorted.bam          ../S105_sorted.bam      ../S107_sorted.bam      ../S113_sorted.bam      ../S114_sorted.bam      ../S115_sorted.bam      ../S
Aradu.A01_______296611  T       C       T       T       T       T       T       T       T       T       T       T       T       T       T       T       T/C     T       T/C     T       T       T       T
Aradu.A01_______326689  T       C       T/C     T       T       T       T/C     T       T       T       T/C     T/C     T       T       T       T       T       T       T       T/C     T/C     T       T
Aradu.A01_______615910  T       G       T       T       T       T       T       T       T       T       T       T       T       T       T       T       T       T       T       T       T       T       T
Aradu.A01_______661394  T       A       T       T       T       T       T       T/A     T       T       T       T       T       T       T       T       T       T       T       T       T       T       T

Se você quiser que os dados sejam salvos em um arquivo diferente, execute-o como ./add_underscore.py input.txt > output.txt

    
por 28.01.2017 / 21:06