divide um arquivo grande em um novo arquivo com nomes de arquivos exclusivos

5

Eu preciso dividir um arquivo em nomes de arquivo exclusivos.
Eu posso fazer isso com o comando sed , por exemplo, sed -n '/scaffold135_/w 135-scaf.txt' input file.txt , mas é demorado, então eu preciso de uma maneira inteligente de fazer isso mais rápido. Abaixo está um exemplo de entrada (o arquivo original tem um milhão de linhas):

scaffold1_115,T,N,N,N,N,A,N,N,N,N,N,N,T,N,T,T,N,A,A,N,N,A
scaffold1_123,A,N,N,N,N,G,N,N,N,N,N,N,A,N,A,A,N,G,G,N,N,G
scaffold1_140,C,N,N,N,N,C,N,N,N,N,N,N,C,N,C,C,N,T,C,N,N,C
scaffold2_161,G,N,N,N,N,G,N,C,N,N,C,N,G,N,G,G,N,G,G,C,N,G
scaffold2_162,C,N,N,N,N,C,N,T,N,N,T,N,C,N,C,C,N,C,C,T,N,C
scaffold2_180,C,N,N,N,N,C,N,T,N,N,C,C,C,T,C,C,T,C,C,C,N,C
scaffold2_194,C,N,N,C,N,C,C,C,C,C,C,C,C,C,T,C,C,C,C,C,N,C
scaffold3_195,G,N,N,G,G,C,G,G,G,G,G,G,C,G,C,G,G,C,C,G,N,C
scaffold3_234,T,N,A,T,A,A,T,T,T,A,T,A,A,T,A,A,T,A,A,T,N,A
scaffold101_282,C,T,T,T,C,C,T,C,T,C,C,C,C,T,C,C,T,C,C,C,N,C
scaffold101_371,T,T,T,T,T,C,T,T,T,T,T,T,T,T,T,T,T,T,T,T,N,C
scaffold101_372,T,T,T,T,C,C,T,T,T,T,T,T,T,T,T,T,T,T,T,T,N,C

As linhas são exclusivas. Eu quero linhas específicas para cada scafold em um arquivo separado, digamos todas as linhas que começam com scaffold1_ em um arquivo chamado scaffold1.txt e assim por diante até scaffold10156.txt que contém as linhas começando com scaffold10156_

    
por kapr0001 21.09.2015 / 14:47

2 respostas

7

Você deve conseguir usar o redirecionamento com awk

awk -F'_' '{print > $1".txt"}' file

Se as linhas que compartilham o prefixo scaffoldn_ forem contíguas, você poderá fazer o seguinte para evitar violar o limite de identificadores de arquivos abertos

awk -F'_' 'NR == 1 || $1 != prev{if (f) close(f);f=$1".txt"; prev=$1}; 
{print > f};END{if (f) close(f)}' file
    
por 21.09.2015 / 14:59
1

Para o GNU sed :

sed 's/scaffold\([0-9]*\)_.*/echo "&" >> "-scaf.txt"/e' infile
    
por 21.09.2015 / 16:06