Grep/Awk/Sed para um conjunto de linhas de "0010|" para "0070|" E que contém uma correspondência no $PH_NO
Abaixo estão os dados de amostra. Preciso obter o número de telefone presente no campo 0012 e os registros completos do cliente correspondentes, linhas de 0010 a 0070. Um arquivo de dados pode conter dois ou três registros de clientes com o mesmo número de telefone e preciso obter todos eles.
0010|Kumar||57 Rich street|Chennai|Tamil Nadu|
0011|20171115| ID
0012|149 196 222| PH Number
0013|20161101|20171102|
0022|Payment Method |Lucky customer|
0080|P|5.00-|20161111|Payment|
0080|P|5.00-|20161130|Payment|
0080|TP|10.00-|||
0070|000AYDCHDFF|820|762|
0010|RAM||57 Rich street|Chennai|Tamil Nadu|
0011|20171115| ID
0012|149 196 333| PH Number
0013|20161101|20171102|
0022|Payment Method |Lucky customer|
0080|P|5.00-|20161111|Payment|
0080|P|5.00-|20161130|Payment|
0080|TP|10.00-|||
0070|000AYDCHDFF|820|762|
0010|Joe||57 Rich street|Chennai|Tamil Nadu|
0011|20171115| ID
0012|149 196 222| PH Number
0013|20161101|20171102|
0022|Payment Method |Lucky customer|
0080|P|5.00-|20161111|Payment|
0080|P|5.00-|20161130|Payment|
0080|P|5.00-|20161111|Payment|
0080|P|5.00-|20161130|Payment|
0080|P|5.00-|20161111|Payment|
0080|P|5.00-|20161130|Payment|
0080|TP|10.00-|||
0070|000AYDCHDFF|820|762|
Observação: estou em um servidor AIX com ksh.
Então você quer todo o registro de 0010 a 0070, se o número de PH corresponder
$PH_NO"
? Então estesed
oneliner funcionará:/^0010/,/^0070/H
para anexar um registro de 0010 a 0070 ao espaço de espera/^0010/h
o 0010 não deve ser anexado, mas iniciar um novo registro, então copie-o para o espaço de espera/^0070/! d
nenhum processamento ou saída adicional, a menos que seja o item 0070x;/|$PH_NO| PH Number/! d"
troque os espaços, para que todo o registro esteja no espaço do padrão agora e exclua-o se não contiver o referido número.149 196 222
no comando acima é o número de telefone do cliente. Altere-o para o número de telefone que você deseja descobrir.CUSTOMER_FILE
é o arquivo que você deseja pesquisar. Altere-o para o nome do arquivo.Você também pode colocar o código em um script bash e substituir
149 196 222
por . Diga find-customer.sh, então você pode executar o script assim$1
CUSTOMER_FILE
$2
./find-customer.sh '149 196 222' your-file-name
Pré-requisito deste pedaço de código:
0010 ... <no 0010 or 0012 or 0070> ... 0012 ... <no 0010 or 0012 or 0070> ... 0070 ... <repeated content as above or end of file>
ATUALIZAR
Esta é uma versão de alto desempenho. (Pelo menos maior que o original acima. Nenhum loop for envolvido.)
ATUALIZAÇÃO para AIX
Como o solicitante está trabalhando no AIX. O grep no AIX não suporta opções de contexto, -A, -B, -C.
Na Internet, há uma variedade de implementações "cgrep" (context grep) para resolver esse problema (para simular a opção GNU grep context). Mas a maioria deles não pode fornecer a mesma saída que o GNU grep. Apenas um que encontrei é o mais próximo da opção de contexto GNU grep. O link é https://stackoverflow.com/questions/1685678/advanced-grep-unix/1685782#1685782
Fiz algumas modificações necessárias para este caso.
Salve este arquivo como
grep-context.sh
e substituagrep -C1
por./grep-context.sh 1
no meu comando acima.Outra maneira que eu acho que é de uma vez por todas é compilar GNU grep no AIX. (também compilar GNU sed apenas no caso)
Você pode usar este script:
Coloque-o em um arquivo e adicione a permissão de execução com este comando
Variável START: Seu número de linha inicial (por exemplo, 0010)
Variável END: Sua variável final (por exemplo, 0070)
Variável MATCH: A palavra/caractere/número que você está procurando em uma linha (por exemplo, 0012)
Variável RSTART: O número da linha inicial no arquivo de texto (por exemplo, 1)
Variável REND: O número da linha inicial no arquivo de texto (por exemplo, 32)
EDITAR:
Você também pode ver quantas vezes uma linha é repetida, alterando a última linha para esta: