Extraindo vários dados da coluna com sed

2

Eu tenho um arquivo com informações como esta

Info A: 1
Info B: 2
Info C: 3
Info D: 4

Info A: 1
Info B: 2
Info C: 123
Info D: 4

Agora estou tentando obter a linha com Info C, mas preciso dela separadamente. Eu preciso de um comando para obter a saída do Info C do primeiro bloco e um comando para obter o Info C do segundo bloco. Este comando funciona para mim, para obter o Info C de ambos os blocos. Na primeira parte do comando, estou excluindo todas as coisas, exceto as linhas com Info C. Na segunda parte do comando, estou excluindo a string "Info C:"

cat test2 | sed -e '/Info C: /!d' -e 's/Info C: //'

A saída contém apenas o valor:

3
123

Agora, para obtê-lo separadamente, eu tentei vários argumentos para sed mas nada funciona para mim.

A solução a seguir funciona bem para mim. Acabei de imprimir a primeira ou a última linha

cat test2 | sed -e '/Info C: /!d' -e 's/Info C: //' | sed -n '$p'
cat test2 | sed -e '/Info C: /!d' -e 's/Info C: //' | sed -n '1p'

Mas gostaria de saber se existe uma solução sem um segundo pipeline para sed?

    
por Alex 16.10.2016 / 19:46

2 respostas

2

Bem, se o seu shell suporta matrizes, você pode fazer:

$ infoC=( $(sed -n 's/Info C: \(.*\)//p' file ) )
$ echo ${infoC[0]}
3
$ echo ${infoC[1]}
123

Ou com o GNU sed :

infoC=($(sed -rn 's/Info C: (.*)//p' file ))

Estou usando um comando sed mais simples aqui. O -n suprime a saída normal, portanto, imprime apenas as linhas para as quais você diz. O operador de substituição corresponde às linhas com Info C: e captura (com os parênteses) o valor que é salvo como . Por isso, irá substituir a linha com e imprimi-la (o p no final).

O var=( $(command) ) é uma maneira de salvar a saída de command na matriz var . O primeiro elemento é então ${var[0]} , o segundo ${var[1]} etc. Aqui, o nome da matriz é infoC .

    
por 16.10.2016 / 20:37
0
cat test2 | sed -e '/Info C: /!d' -e 's/Info C: //' | sed -n '1p;$p'
    
por 21.01.2017 / 13:28