Imprime linha após a ocorrência n.

8

Eu estou olhando para exibir a linha 4598 no seguinte arquivo. Efetivamente, quero exibir a linha APÓS a enésima ocorrência de uma correspondência. Nesse caso, a linha após a terceira ocorrência de <Car> . Como eu faço isso?

<Car>
10456
</Car>
<Car>
70192
</Car>
<Car>
4598
</Car>
    
por DJ180 14.02.2014 / 17:38

5 respostas

10
awk -v n=3 '/<Car>/ && !--n {getline; print; exit}'

Ou:

awk '/<Car>/ && ++n == 3 {getline; print; exit}'

Para passar o padrão de pesquisa como uma variável:

PATTERN='<car>' awk -v n=3 '
  $0 ~ ENVIRON["PATTERN"] && ++n == 3 {getline; print; exit}'

Aqui, usando ENVIRON em vez de -v as -v expande sequências de escape de barra invertida e barras invertidas são freqüentemente encontradas em expressões regulares (então seria necessário dobrar com -v ).

    
por 14.02.2014 / 17:50
4

Aqui está um perl:

perl -ne 'print && exit if $c==3; $c++ if /<Car>/;' file 

Com o GNU grep , você também pode analisar sua saída como:

grep -A 1 -m 3 '<Car>' file | tail -n 1

De man grep :

-A NUM, --after-context=NUM
          Print NUM lines of trailing context after matching lines.  
          Places a line containing a group separator (--) between 
          contiguous  groups  of  matches.          
-m NUM, --max-count=NUM
          Stop reading a file after NUM matching lines.  
    
por 14.02.2014 / 18:12
3

Com GNU awk , você pode fazer:

gawk -v RS='</Car>' 'NR==3 && $0=$2' inputFile
    
por 15.02.2014 / 23:44
1

Aqui está outra maneira com sed :

sed -n '/<Car>/{x;/.\{2\}/{x;$!{n;p};q};s/.*/&./;x}' infile

Isso está usando o espaço de espera para contar.
Cada vez que encontrar uma linha correspondente a <Car> it e x altera os buffers e verifica se há exatamente N-1 ocorrências de um caractere no buffer de retenção. Se a verificação for bem-sucedida, e x será alterado novamente e, se não estiver na última linha, ele extrairá a linha n ext e p rints o espaço padrão, em seguida, q uits. Caso contrário, apenas adiciona outro . char ao espaço de espera e e x é alterado novamente.

    
por 17.05.2016 / 23:45
0

Aqui está uma solução simples de linha de comando.

grep -F -A1 '<Car>' filename | grep -E -v '<Car>|--' | tail -n +3 |head -n +1

Se você alterar o valor de +3 após tail , poderá especificar qualquer enésima linha.

    
por 14.02.2014 / 18:11