Substitua um arquivo de texto da coluna i por números crescentes

Substitua um arquivo de texto da coluna i por números crescentes

preciso fazer algo muito parecido com issoSubstitua string por índice sequencial, mas não preciso adicionar um número a uma coluna, mas substituir uma coluna inteira por números crescentes. 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

(Eu não me importo se começa com 0 ou 1)

Sinto-me muito estúpido, mas não consigo ajustar a solução dessa pergunta ao meu caso...

Responder1

Para numerar linhas, você pode usar nl. Para remover colunas (ou melhor, filtrar aquelas 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 irritante nlé que ele insere preenchimento de espaço no início da linha (por padrão, o campo do número da linha tem 6 caracteres de largura e você não deseja diminuir isso porque isso truncaria os números das linhas). Podemos nos livrar deles 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 cututilitário obtém uma lista de colunas que você deseja "cortar" da entrada. No nosso caso são as colunas 2 em diante ( -f 2-). Como seus dados são delimitados por tabulações, cutfaremos isso sem modificação; caso contrário, é possível solicitar outro delimitador com -d.

O sedcomando simplesmente substituirá esses espaços no início da linha por nlnada.

Responder2

Comawk

$ 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

Responder3

With 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 (.,.)ncomando imprime as linhas endereçadas, precedendo cada linha pelo seu número de linha e uma tabulação - perfeito para o seu formato delimitado por tabulações.

informação relacionada