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 cut
utilitá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, cut
faremos isso sem modificação; caso contrário, é possível solicitar outro delimitador com -d
.
O sed
comando simplesmente substituirá esses espaços no início da linha por nl
nada.
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 (.,.)n
comando 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.