Eu tenho um arquivo que se parece com o seguinte:
chr19 61336212 + 0 0 CG CGT
chr19 61336213 - 0 0 CG CGG
chr19 61336218 + 0 0 CG CGG
chr19 61336219 - 0 0 CG CGC
chr19 61336268 + 0 0 CG CGG
chr19 61336269 - 0 0 CG CGA
chr19 61336402 + 0 0 CG CGG
chr19 61336403 - 0 0 CG CGT
Eu quero dividir esse arquivo para cada intervalo de 10000 do 2º campo (NÃO linhas, mas intervalo numérico). Portanto, para este arquivo, gostaria de dividir da primeira linha (a linha com 61336212) para a linha que tem ou até 61346211 (61336212 + 9999), depois de 61346212 a 61356211 e assim por diante. Como você pode ver, os números no 2º campo / coluna não são 'preenchidos'.
Existe uma maneira de fazer isso?
text-processing
awk
split
agathusia
fonte
fonte
Respostas:
Iria escrever para
file.0000
,file.0001
... (o número estarint(($2-n)/10000)
onden
está$2
para a primeira linha).Observe que fechamos os arquivos quando paramos de gravá-los, caso contrário, você atingia o limite do número de arquivos abertos simultaneamente após algumas centenas de arquivos (o GNU
awk
pode contornar esse limite, mas as performances se degradam rapidamente).Estamos assumindo que esses números estão sempre subindo.
fonte
file = ...
, mas como a iteração funciona? Não há parte que digan = n + 10000
nemlower_boundary <= $2 < upper_boundary
parte. Em geral, o todoif (file != last_file) { close(last_file) ; last_file = file }
está fora do meuif (file != last_file)
: se o arquivo atual não for o mesmo que o arquivo anterior, feche o arquivo anterior (tenha apenas um arquivo aberto por vez (não precisamos mantê-los todas abertas como outras soluções))Corte a versão one-liner. Talvez mais adequado para o Code Golf do que este fórum. Isso gera split1, split2, split3 e assim por diante, como nomes de arquivos.
Para ter arquivos de saída denominados split001, split002, split003, envolve este extra
sprintf
:Para evitar o problema de desaceleração gritante identificado por @ Stéphane Chazelas, use perl:
fonte
sprintf
mágica extra agora adicionada.Teste com intervalo definido como 100:
Nota: produzirá arquivos vazios por intervalos vazios; para remover arquivos vazios, adicione:
Será executado sobre o arquivo para cada etapa do
for
loop, portanto não é o mais eficiente.fonte
Se você quer dizer apenas cálculo, não contagem de linhas:
fonte