Linux-Shell: Extrahieren Sie durch Pipes getrennte Werte aus einer Datei

Linux-Shell: Extrahieren Sie durch Pipes getrennte Werte aus einer Datei

Ich habe folgende Werte in einer Datei:

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

Ich muss die Werte Papa, Salchicha, Aceite, Queso erhalten

das heißt ich muss mir die Werte aus Zeile 2, Spalte 2 holen.

Antwort1

Sie können sie alle durch Ändern in ein Array einlesen IFSund für die zukünftige Verwendung aufbewahren...

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

echo ${array[0]}
Salchipapa

echo ${array[1]}
papa

Auf diese Weise beschränken Sie sich nicht auf beliebige 10 Werte und müssen später auch nicht auf „Null“ testen, da Sie die Anzahl der Elemente im Array kennen …

echo ${#array[@]}
5

Also, du hast einfach ...

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

Antwort2

Ich habe es so gemacht und es hat funktioniert:

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

„sed -n 2p $filename“ ruft die zweite Zeile der Datei ab, und dann gibt mir „cut -d '|' -f $i“ alle Zutaten durch Pipes getrennt aus. Die Zahl 10 gibt an, dass es maximal 10 Zutaten gibt, daher überprüfe ich später im Code, dass ich nur gearbeitet habe, wenn die Variable ingName nicht null ist.

Antwort3

Vorausgesetzt, der Inhalt der eigentlichen Datei ist

31915
Salchipapa|papa|salchicha|aceite|queso

dann könnten Sie verwenden

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

um die Felder ab dem 2. Feld ab der zweiten Zeile zu drucken, ein Wort pro Ausgabezeile.

Der folgende sedBefehl würde dasselbe bewirken:

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

Dies geschieht, indem die erste Zeile aus der Eingabe gelöscht wird, dann alle Pipes in Zeilenumbrüche geändert werden und bis zur ersten (einschließlich) neuen Zeile gelöscht wird.

Die Pipeline

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

würde bei den Beispieldaten die gleiche Ausgabe erzeugen, indem die letzte Zeile mit herausgesucht wird tail, die Felder ab der zweiten mit extrahiert werden cutund anschließend alle Pipes in Zeilenumbrüche geändert werden.

Eine Variation des oben genannten:

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

Antwort4

Habe es mit dem folgenden Befehl versucht und es hat gut funktioniert

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

Ausgabe

papa
salchicha
aceite
queso

verwandte Informationen