Como pesquisar um arquivo para cada entrada de uma lista e imprimir um novo arquivo para cada entrada

1

Eu tenho um arquivo ( list_file ) que é uma lista de nomes e outro arquivo ( data_file ) que contém centenas de milhares de linhas de texto, cada uma começando com um nome em list_file . Eu quero fazer uma pesquisa do data_file para todas as linhas que começam com cada nome em list_file e exportar as linhas para cada nome para um novo arquivo *.txt (onde * é o nome na lista)

Eu tenho isso

grep -f "list_file" data_file > out.txt

mas isso não separa cada linha da lista em seu próprio arquivo.

Amostra list_file :

100_fullA
100_fullB
105_fullA
105_fullB
112_fullA
112_fullB
121_fullA
121_fullB

Amostra data_file :

100_fullA NGATCATCGACAC
100_fullB NGATCATCGACAC
105_fullA NGATCATCGACAC
105_fullB NGATCATCGACAC
112_fullA NGATCATCGACAC
112_fullB NGATCATCGACAC
121_fullA NGATCATCGACAC
    
por Josh 20.02.2017 / 23:42

3 respostas

1

Você poderia criar uma tabela de pesquisa (ou hash) a partir de list_file , por exemplo, usando uma matriz associativa em awk :

awk 'NR==FNR {list[$1]=1; next} $1 in list {print > $1".txt"}' list_file data_file

As saídas irão para os arquivos 100_fullA.txt , 100_fullB.txt e assim por diante.

    
por 21.02.2017 / 00:46
0

Você pode fazer isso construindo os comandos em tempo real:

grep -f list_file data_file | sed -e "s/^\([^ ]*\).*/echo '&' >> ;/" | sh
    
por 21.02.2017 / 01:02
0

Aqui está uma solução usando o Bash:

#!/bin/bash

while read pointer; do
 filename="$(echo $pointer | cut -d ' ' -f 1)" 
 if grep $filename list_file > /dev/null; then
  echo $pointer >> output/"$filename".txt
 fi
done < data_file

Aqui está uma análise detalhada por linha:

  • A linha 3 é o começo do loop while usado para percorrer data_file.

  • A linha 4 ecoa a linha lida na iteração atual. A linha é então passou a cortar, que corta a primeira parte da linha usando um espaço como o delimitador. O resultado é então atribuído a uma variável chamado "nome do arquivo".

  • A linha 5 usa o grep para determinar se o anteriormente valor determinado existe em list_file. Se grep conseguir encontrar o valor (status de retorno 0), o script continua na linha 6. Se o grep não encontrar nada (status de retorno 1), o script inicia o loop.

  • A linha 6 ecoa a linha inteira para saída / "$ filename" .txt.

  • A linha 7 fecha a instrução if.

  • A linha 8 fecha o loop e é onde o data_file é referenciado.

Outras notas importantes:

  • O diretório "output /" deve ser criado antes de o script ser executado, caso contrário, você receberá um erro como "output: no tal arquivo ou diretório". Se isso for um problema, pode ser facilmente resolvido adicionando "saída mkdir" ao início do script.
  • Você mencionou data_file tem centenas de milhares de linhas. Por causa disso, esse script provavelmente levará muito tempo para ser concluído. Se você se deparar com esse arquivo frequentemente, valeria a pena traduzir as informações no MariaDB ou banco de dados similar.
  • Se list_file também contiver muitas entradas, o script demorará um tempo insanamente longo para ser executado, porque o grep na linha 5 consulta o list_file inteiro para cada iteração do loop. Novamente, esse é um problema que pode ser resolvido com as ferramentas disponíveis em um banco de dados SQL.
por 21.02.2017 / 02:02