Substitua uma coluna em um arquivo de texto por números incrementados

1

Eu preciso fazer algo muito semelhante a essa Substituir string por seqüenciais index , mas não preciso adicionar um número a uma coluna, mas substituo uma coluna inteira por números incrementais. Assim:

0   0   chr1    3000575 3000801 0   chr1    4340023 4340249 32  32  
0   0   chr1    3000641 3000801 -1  chr1    3311943 3311783 32  32  
0   0   chr1    3000674 3000801 -1  chr1    3001534 3001407 32  32  
0   0   chr1    3000674 3000801 -1  chr1    3001534 3001407 32  32  
0   0   chr1    3000674 3000801 -1  chr1    3001534 3001407 32  32

torna-se

0   0   chr1    3000575 3000801 0   chr1    4340023 4340249 32  32  
1   0   chr1    3000641 3000801 -1  chr1    3311943 3311783 32  32  
2   0   chr1    3000674 3000801 -1  chr1    3001534 3001407 32  32  
3   0   chr1    3000674 3000801 -1  chr1    3001534 3001407 32  32  
4   0   chr1    3000674 3000801 -1  chr1    3001534 3001407 32  32

(não importa se começa com 0 ou 1)

Eu me sinto muito estúpida, mas não posso ajustar a solução da pergunta para o meu caso ...

    
por Phlya 25.06.2016 / 18:52

3 respostas

3

Para numerar linhas, você pode usar nl . Para remover colunas (ou, em vez disso, filtrar as que você deseja manter), você pode usar cut :

$ cut -f 2- cols.txt | nl
     1  0       chr1    3000575 3000801 0       chr1    4340023 4340249 32      32
     2  0       chr1    3000641 3000801 -1      chr1    3311943 3311783 32      32
     3  0       chr1    3000674 3000801 -1      chr1    3001534 3001407 32      32
     4  0       chr1    3000674 3000801 -1      chr1    3001534 3001407 32      32
     5  0       chr1    3000674 3000801 -1      chr1    3001534 3001407 32      32

A única coisa incômoda com nl é que ele insere preenchimento de espaço no início da linha (por padrão, o campo de número de linha tem 6 caracteres de largura e você não deseja diminuir isso porque truncaria números de linha). Podemos nos livrar disso assim:

$ cut -f 2- cols.txt | nl | sed 's/^ *//'
1       0       chr1    3000575 3000801 0       chr1    4340023 4340249 32      32
2       0       chr1    3000641 3000801 -1      chr1    3311943 3311783 32      32
3       0       chr1    3000674 3000801 -1      chr1    3001534 3001407 32      32
4       0       chr1    3000674 3000801 -1      chr1    3001534 3001407 32      32
5       0       chr1    3000674 3000801 -1      chr1    3001534 3001407 32      32

O utilitário cut obtém uma lista de colunas que você deseja "cortar" da entrada. No nosso caso, são as colunas 2 e seguintes ( -f 2- ). Como seus dados são delimitados por tabulação, cut fará isso sem modificação, caso contrário, é possível dizer a ele para usar outro delimitador com -d .

O comando sed simplesmente substituirá esses espaços no início da linha de nl com nada.

    
por 25.06.2016 / 19:14
3

com awk

$ awk '{$1=FNR-1; print}' OFS='\t' file
0   0   chr1    3000575 3000801 0   chr1    4340023 4340249 32  32
1   0   chr1    3000641 3000801 -1  chr1    3311943 3311783 32  32
2   0   chr1    3000674 3000801 -1  chr1    3001534 3001407 32  32
3   0   chr1    3000674 3000801 -1  chr1    3001534 3001407 32  32
4   0   chr1    3000674 3000801 -1  chr1    3001534 3001407 32  32
    
por 25.06.2016 / 19:19
1

Com ed (usando uma tabulação literal, composta como Ctrl-V + TAB , na substituição)

$ ed -s file << EOF
,s/0    //
,n
q
EOF

1   0   chr1    3000575 3000801 0   chr1    4340023 4340249 32  32  
2   0   chr1    3000641 3000801 -1  chr1    3311943 3311783 32  32  
3   0   chr1    3000674 3000801 -1  chr1    3001534 3001407 32  32  
4   0   chr1    3000674 3000801 -1  chr1    3001534 3001407 32  32  
5   0   chr1    3000674 3000801 -1  chr1    3001534 3001407 32  32

O comando (.,.)n imprime as linhas endereçadas, precedendo cada linha pelo seu número de linha e uma tabulação - perfeita para o formato delimitado por tabulações.

    
por 25.06.2016 / 22:21