precisa corresponder uma string e depois imprimir as próximas correspondências de string e continuar até a próxima string

0

Estou com problemas para manipular um arquivo de texto grande

Minha amostra f1.txt tem várias linhas de mais de 3000, com o formato abaixo

Eu preciso combinar uma string, e depois combinar as linhas depois dessa string com outra string (aqui, neste caso, "necessário") e imprimir as linhas correspondentes junto com a string original.

Isso deve continuar até que todas as strings acabem.

Exemplo de requisito abaixo, você pode ajudar?

====== f1.txt ====

String      :  a

--
==

==


needed line ------------ 100

needed line -------------200


-





String      :  b


--
==

==


needed line ------------ 500

needed line -------------600

needed line ------------ 700

needed line -------------800

-


String      :  c

--

==


needed line ------------ 900



===
===

OUTPUT NECESSÁRIO

a needed line ------------ 100

a needed line -------------200

b needed line ------------ 500

b needed line -------------600

b needed line ------------ 700

b needed line -------------800

c needed line -------------900
por user261334 30.08.2014 / 11:17

2 respostas

2

No awk,

awk -F" : " '/^String/ {string = $2}; /^needed/ {print string, $0}' f1.txt

Você pode fazer uma coisa parecida no sed, embora não seja tão compacto - basicamente ele usa espaço de espera do sed como o equivalente da variável string . Infelizmente a AFAIK não tem uma maneira simples de acrescentar o espaço de espera ao espaço padrão no sed, então temos que acrescentar e depois trocar a ordem depois:

sed -rn -e '/^String : / {s///;h;}' -e '/^needed/ {G;s/(.*)\n(.*)/ /;p;}'  f1.txt

OBSERVAÇÃO: uma solução completa provavelmente deve verificar se String foi encontrada e atribuída antes de tentar imprimi-la (caso o arquivo contenha needed linhas antes de qualquer String ).

    
por steeldriver 30.08.2014 / 12:29
0

Veja um script de exemplo que faz isso: link

Eu fiz algumas suposições:

  1. Sua atribuição usará : como o separador. Eu tirei vantagem disso ao definir o IFS para read .
  2. Você não se importa de passar o arquivo várias vezes. Isso pode ser feito de uma só vez, na verdade pode ser mais fácil, dependendo da implementação.
por muru 30.08.2014 / 12:18