Como extrair linhas iniciando com os mesmos 2 primeiros caracteres e depois enviar para arquivos separados?

0

Eu tenho uma lista de texto muito grande e preciso de uma maneira de extrair linhas começando com os mesmos 2 caracteres, depois salve essas linhas para separar os arquivos nomeados após esses 2 caracteres.

Lista de exemplos:

abWEye7kgw7  
abff34ZSrZf  
abke8mzMyma  
b2R5mPZGbCb  
b2zhhCeLZzZ  
b2q2T5rkACp  
k9ekzbc8nUh  
k9QzXBUrNT7  
k92RtdXntZ3  
vrTtR9GmbWG  
vraVM9QXWzY  
vrME9QnksBf  

Saída desejada:

ab* > ab.txt  
b2* > b2.txt  
k9* > k9.txt  
vr* > vr.txt

A lista é bastante grande e há muitas combinações de dois primeiros caracteres.

    
por GetShorty 10.01.2018 / 11:47

4 respostas

4
$ awk '{ f = substr($0,1,2) ".txt"; print >f }' file.in

$ ls
ab.txt  b2.txt  file.in k9.txt  vr.txt

$ cat ab.txt
abWEye7kgw7
abff34ZSrZf
abke8mzMyma

Isso obviamente pode ser resolvido no shell também, mas awk é mais adequado para analisar arquivos de texto. O substr() seleciona os dois primeiros caracteres de cada linha no arquivo de entrada, e isso é atribuído à variável f com .txt adicionada ao final. O print emitirá a linha atual para o arquivo cujo nome está em f .

Eu acredito que você pode acabar com a variável f e usar a expressão substr() diretamente após > , mas não na implementação awk que estou usando no OpenBSD (isso é possivelmente um bug) .

Se o número de combinações diferentes de dois primeiros caracteres for muito, você poderá ter problemas com muitos arquivos abertos.

A seguinte variação cuidará disso:

awk '{ f = substr($0,1,2) ".txt"; print >>f; close(f) }' file.in
    
por 10.01.2018 / 11:53
1

awk solution:

awk -v FS='' '{ print > $1$2".txt" }' file

Um dos arquivos resultantes:

$ cat k9.txt 
k9ekzbc8nUh
k9QzXBUrNT7
k92RtdXntZ3
    
por 10.01.2018 / 11:57
0

Tente isto:

cat list.txt | while IFS= read -r st; do echo $st >> ${st:0:2}.txt; done

    
por 10.01.2018 / 11:56
0

Eu usei o método abaixo para alcançar o resultado. Testado seus trabalhos bem

 for j in 'awk '{print substr($1,1,2)}' k.txt  | uniq -c | awk '$1 >=2 {print $2}''; do sed -n "/^$j/p" k.txt > $j.txt; done

Ele extrai os dois primeiros caracteres de cada linha. Se o primeiro caractere 2 é o mesmo em mais de uma linha. ele irá imprimir a linha relacionada salvar as linhas no nome do primeiro caractere 2

Saída

 cat ab.txt
    abWEye7kgw7
    abff34ZSrZf
    abke8mzMyma

    cat b2.txt
    b2R5mPZGbCb
    b2zhhCeLZzZ
    b2q2T5rkACp

     cat k9.txt
    k9ekzbc8nUh
    k9QzXBUrNT7
    k92RtdXntZ3

 cat vr.txt
vrTtR9GmbWG
vraVM9QXWzY
vrME9QnksBf
    
por 10.01.2018 / 16:03