Qual é a melhor maneira de encontrar uma lista de várias cadeias dentro de um arquivo de texto grande

6

A pergunta geral é: No Unix / Linux, qual é a melhor maneira de encontrar uma lista de várias (cerca de 150) strings dentro de um arquivo de texto grande?

Eu estou perguntando isso para todos os especialistas em Unix / Linux como uma questão geral, na esperança de que eu possa encontrar uma solução que pertence ao meu caso particular: Eu tenho a sensação de que isso vai levar um pouco de ajustes.

Eu tenho um arquivo de texto grande (na verdade, um conjunto de dados do MVS) em uma máquina IBM Unix System Services (USS) - acredito que esteja em torno de 6 GB.

Eu também tenho uma lista de cerca de 150 identificadores de 5 caracteres no formato AAAAA que eu preciso encontrar dentro desse arquivo - isto é, eu gostaria de extrair linhas do arquivo que contém qualquer uma das 150 identificadores específicos que estou procurando.

O formato de cada linha no arquivo grande é:

00000000000A00000000000000000AAAAA\n

em que 0 representa um dígito e A representa um caractere alfanumérico. A string que estou procurando está sempre no final da linha.

Trabalhar com conjuntos de dados parece ser um pouco complicado no USS, e não consigo copiá-lo para o ambiente Unix porque ele é muito grande. Os utilitários padrão do Unix não operam em conjuntos de dados (dd, por exemplo); no entanto, sed, awk e grep parecem funcionar em algum grau (embora as opções de linha de comando pareçam um pouco diferentes).

Eu posso usar o conjunto de dados da seguinte forma:

cat  "//'MVS.DATASET'" | grep -e"LOOKFOR1" -e"LOOKFOR2" -e"LOOKFOR3" > output_to_file.txt

No entanto, ele não me permitirá usar todos os 150 itens em uma linha; Eu poderia dividi-lo e executá-lo várias vezes, mas sinto que deveria haver uma maneira melhor.

Eu tentei usar um script sed da seguinte forma, mas não conheço o sed, e recebi um erro que dizia "lixo após o comando". Salvei o seguinte em um arquivo sed-script.txt:

s/AAA01/&/p
s/AAA30/&/p
s/AAA10/&/p
... etc ...

e depois executou sed -f sed-script.txt "//'MVS.DATASET'"

Novamente, isso falhou com o "sed: FSUM7294 lixo após o comando".

Então, 1. Como alguém normalmente lidaria com este problema no ambiente Unix "médio", e 2. Você tem algum conhecimento específico para este caso em particular?

    
por transistor1 07.09.2012 / 19:45

2 respostas

11

grep suporta a obtenção de padrões de um arquivo -f e se torna mais eficiente se você também especificar strings fixas ( -F ):

grep -F -f patterns.txt "//'MVS.DATASET'"
    
por 07.09.2012 / 19:53
0

Você pode armazenar sua lista de 150 5 caracteres em um arquivo primeiro e depois executar um loop para padrões de grepping -

for i in 'cat file'
do
cat mvsfile | grep -i $i >> matched_lines
done
    
por 09.09.2012 / 21:18