Extraindo uma parte de String usando grep / sed / awk

0

Eu tenho um arquivo de texto com algo parecido com isto:

duration:       17100
series:         2016
episode:        58
modesizes:      original: hd1=9120MB,hd2=7543MB,sd1=4872MB,high1=2833MB,low1=634MB
runtime:        285


duration:       13740
series:         2016
episode:        59
modesizes:      original: hd1=9024MB,hd2=7203MB,sd1=5104MB,high1=2950MB,low1=570MB
runtime:        229

Gostaria de extrair duration , episode e modesizes . A saída deve ficar assim:

13740,59,9024MB,7203MB,5104MB,2950MB,570MB
    
por nn7 16.09.2016 / 13:26

3 respostas

1

com awk :

awk '/duration|episode/{printf "%s,", $2} /modesizes/{gsub(/[^=,]+=/,"",$3); print $3}' file

Explicação:

  • /duration|episode/ se a linha corresponder a duration ou episode
    • printf "%s,", $2 , em seguida, imprima o campo com o valor
  • /modesizes/ se a linha corresponder a modesizes
    • gsub(/[^=,]+=/,"",$3) , em seguida, remova os identificadores e o sinal de igual
    • print $3 e imprime o campo alterado

Com o seu exemplo de entrada, imprime:

17100,58,9120MB,7543MB,4872MB,2833MB,634MB
13740,59,9024MB,7203MB,5104MB,2950MB,570MB
    
por 16.09.2016 / 14:06
2

Se você tiver grep com pcre regex

$ grep -oP '(duration|episode):\s*\K\d+|\d+MB' ip.txt | pr -ats, -7
17100,58,9120MB,7543MB,4872MB,2833MB,634MB
13740,59,9024MB,7203MB,5104MB,2950MB,570MB
  • (duration|episode):\s*\K lookbehind positivo para verificar duration ou episode seguidos por : , zero ou mais espaços. Isso não faz parte da saída
  • \d+ um ou mais dígitos
  • |\d+MB padrão alternativo, um ou mais dígitos terminados em MB

A saída assim obtida é estilizada usando pr com , como separador e máximo de 7 colunas

    
por 16.09.2016 / 14:15
0

Uma solução sed:

sed -E -e \
    '/duration:/{
    N;N;N;N
    s/duration:\s*([0-9]*).*episode:\s*([0-9]*).*hd1=([0-9]*MB),hd2=([0-9]*MB),sd1=([0-9]*MB),high1=([0-9]*MB),low1=([0-9]*MB).*/,,,,,/
}' < input_file

Produz:

17100,58,9120MB,7543MB,4872MB,2833MB


13740,59,9024MB,7203MB,5104MB,2950MB

Preserva as linhas vazias.

Se você não quiser isso:

sed -E -n -e \
   '/duration:/{
    N;N;N;N
    s/duration:\s*([0-9]*).*episode:\s*([0-9]*).*hd1=([0-9]*MB),hd2=([0-9]*MB),sd1=([0-9]*MB),high1=([0-9]*MB),low1=([0-9]*MB).*/,,,,,/
    p
    d
}' < input_file
    
por 16.09.2016 / 14:19

Tags