Ich habe eine Eingabedatei FILE1.TXT wie unten.
11 id1
12
13 AGE = 20
14 NAME = NAME1
15
16 id2
17
18 AGE = 30
19 NAME = NAME2
.
.
.
110 idXYZ
111
112 AGE = AGEXYZ
113 NAME = NAMEXYZ
114
115 idZZZ
116
Ich möchte alle Felder durchsuchen, die zu einer bestimmten ID gehören, und den Wert für NAME erhalten
Ich habe es geschafft, jede ID zu durchlaufen und den folgenden Befehl für jede ID nach Bedarf zu bilden.
sed -n '/11/,/14/p' FILE1.TXT | grep NAME | awk -F "= " '{print $2}'
Das Problem hier ist, ich bekomme die Ausgabe NAME1 , zusätzlich bekomme ich auch NAMEXYZ .
Was sollte geändert werden, damit ich nur NAME1 bekomme, aber nicht NAMEXYZ ?
Um dieses Problem zu umgehen, funktionieren die folgenden Befehle.
sed -n '/11/,/14/p' FILE1.TXT | grep NAME | awk -F "= " '{print $2}'|head -1
Gibt es einen Schalter oder fehlt mir etwas?
^(random no of spaces)11
?sed -n '/^\s*11 /,/^\s*14 /p'
sed -n '/^11 /,/^14 /p' | awk '/NAME/{print $NF}'
wenn Sie dies versucht haben.Verwenden Sie Wortgrenzen:
würde passen
NAME1
und nichtNAME1XYZ
oderXYZNAME1
.Ähnlich,
würde nicht mit Zeilen übereinstimmen, die
111
und enthalten142
.BEARBEITEN: Es scheint, dass die Zahlen in der Eingabedatei tatsächlich Zeilennummern sind. Wenn das der Fall ist, könnte man einfach sagen:
um die gewünschten Zeilen zu erhalten.
quelle
NAME
zwischen den Zeilen 11 und 14. Warum wird alsosed
auf111
und geschaut114
? Wie kann man es nicht zwischen111
und aussehen lassen114
?sed
Ausdruck ändern können .grep
mit-w
Flagge? ist es nicht?-w
wäre äquivalent. Zumsed
Beispiel-w
ist etwas anders.Sie können AWK verwenden
Dies sieht Zeilen zwischen 13 und 17 aus und sucht dann nach Name. Wenn eine Übereinstimmung vorliegt, wird das letzte Wort von gedruckt
Name = LastWord
quelle
$
vorher hinzugefügtNR
und das hat den Fehler verursacht.Sie brauchen dafür kein anderes Werkzeug, es
sed
wird problemlos vollständig gehandhabt.Dies sollte Ihnen nur die erste Folge von Nicht-Leerzeichen nach der Phrase "NAME =" für jede Zeile liefern, in der diese Phrase zwischen den Zeilen 11 und 14 einer Eingabedatei
sed
eingespeist wird.quelle
sed ist nicht das richtige Werkzeug für diesen Job. Verwenden Sie awk, wo Sie die gesuchte ID angeben und den nächsten angezeigten NAME drucken können.
quelle
Generische Version basiert nicht auf Zeilennummer, sondern auf ID-Referenz
quelle
Sie können die Zeilen, die übereinstimmende Muster enthalten, mit sed wie folgt drucken:
-n
- Diese Optionen deaktivieren diesen automatischen Druck und sed erzeugt nur dann eine Ausgabe, wenn dies ausdrücklich über denp
Befehl angegeben wird.p
- druckenquelle