Shell de Linux: extraer valores separados por tuberías de un archivo

Shell de Linux: extraer valores separados por tuberías de un archivo

Tengo los siguientes valores en un archivo:

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

Necesito obtener los valores papa, salchicha, aceite, queso.

eso significa que tengo que obtener los valores de la línea 2, columna 2.

Respuesta1

Puede leerlos todos en una matriz cambiándolos IFSy conservarlos para uso futuro.....

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

echo ${array[0]}
Salchipapa

echo ${array[1]}
papa

De esa manera, no se limitará a 10 valores arbitrarios y tampoco necesitará realizar una prueba de "nulo" más adelante porque conoce el número de elementos de la matriz...

echo ${#array[@]}
5

Así que tú simplemente...

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

Respuesta2

Lo hice así y funcionó:

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

"sed -n 2p $filename" obtiene la segunda línea del archivo y luego "cut -d '|' -f $i" me da cada ingrediente separado por tuberías. el número 10 indica que hay máximo 10 ingredientes, por lo que más adelante en el código valido que trabajé solo cuando la variable ingName no es nula.

Respuesta3

Suponiendo que el contenido real del archivo es

31915
Salchipapa|papa|salchicha|aceite|queso

entonces podrías usar

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

para imprimir los campos desde el segundo campo en adelante desde la segunda línea, una palabra por línea de salida.

El siguiente sedcomando haría lo mismo:

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

Para ello, elimina la primera línea de la entrada, luego cambia todas las canalizaciones a nuevas líneas y elimina hasta (incluida) la primera nueva línea.

La tubería

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

produciría el mismo resultado dados los datos de ejemplo seleccionando la última línea con tail, extrayendo los campos desde la segunda en adelante con cuty luego cambiando todas las tuberías a nuevas líneas.

Una variación de lo anterior:

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

Respuesta4

Probé con el siguiente comando y funcionó bien

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

producción

papa
salchicha
aceite
queso

información relacionada