
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 IFS
und 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 sed
Befehl 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 cut
und 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