Linux Shell: Extraia valores separados por pipes de um arquivo

Linux Shell: Extraia valores separados por pipes de um arquivo

Eu tenho os seguintes valores em um arquivo:

line 1: 31915
line 2: Salchipapa|papa|salchicha|aceite|queso

Preciso pegar os valores papa, salchicha, aceite, queso

isso significa que preciso obter os valores da linha 2, coluna 2 ativada.

Responder1

Você poderia lê-los todos em uma matriz, alterando-os IFSe mantendo-os para uso futuro.....

OIFS=$IFS; IFS='|'; array=($(sed '2q;d' "$filename")); IFS=$OIFS

echo ${array[0]}
Salchipapa

echo ${array[1]}
papa

Dessa forma, você não está se restringindo a 10 valores arbitrários e também não precisa testar 'nulo' mais tarde porque sabe o número de elementos na matriz....

echo ${#array[@]}
5

Então você apenas ....

for (( i=0; i<${#array[@]}; i++ )); do echo ${array[$i]}; done
Salchipapa
papa
salchicha
aceite
queso

Responder2

Fiz assim e funcionou:

     for i in {2..10}
     do
        ingName=$(sed -n 2p $filename | cut -d '|' -f $i)
     done

"sed -n 2p $filename" obtém a segunda linha do arquivo e depois "cut -d '|' -f $i" me dá cada ingrediente separado por tubos. o número 10 indica que são no máximo 10 ingredientes, então mais adiante no código eu valido que trabalhei apenas quando a variável ingName não é nula.

Responder3

Supondo que o conteúdo real do arquivo seja

31915
Salchipapa|papa|salchicha|aceite|queso

então você poderia usar

awk -F '|' 'FNR == 2 { for (i=2; i<=NF; ++i) print $i }' file

para imprimir os campos do 2º campo em diante a partir da segunda linha, uma palavra por linha de saída.

O seguinte sedcomando faria o mesmo:

sed '1d;2y/|/\n/;s/[^\n]*\n//' file

Ele faz isso excluindo a primeira linha da entrada, depois altera todas as barras verticais para novas linhas e exclui até (e incluindo) a primeira nova linha.

O gasoduto

tail -n 1 file | cut -d '|' -f 2- | tr '|' '\n'

produziria a mesma saída, dados os dados de exemplo, selecionando a última linha com tail, extraindo os campos da segunda em diante com cute, em seguida, alterando todos os pipes para novas linhas.

Uma variação do acima:

tail -n 1 file | tr '|' '\n' | tail -n +2

Responder4

Tentei com o comando abaixo e funcionou bem

awk 'NR==2{print $NF}' filename| awk -F "|" '{$1="";print $0}' |sed -r "s/^\s+//g"| perl -pne "s/ /\n/g"

saída

papa
salchicha
aceite
queso

informação relacionada