
Ich stecke in einer verzwickten Situation fest. Ich habe eine Datei, deren Inhalt so aussieht:
3 2017-05-30 2017-09-29
2 2017-05-27 2017-08-26
1 2017-05-27 2017-08-26
Jetzt kann der Benutzer ein Datum ändern, indem er „labelNum“ auswählt. Dabei handelt es sich um die Werte in Spalte 1. Wenn der Benutzer bei der Eingabeaufforderung „3“ eingibt, möchte er Spalte 2 drucken.
Also habe ich geschrieben.
cat temp.txt | grep $labelNum | awk '{print $2}'
Wenn labelNum
3 ist, erhalte ich die Ausgabe als2017-05-30
Wenn der Benutzer jedoch labelNum
2 eingibt, erhalte ich:
2017-05-30
2017-05-27
2017-05-27
Weil es überall in der .txt-Datei nach '2' sucht. Ich möchte jedoch die Spalte 2 für labelNum
2, was wäre2017-05-27
Gibt es eine Möglichkeit, dies zu tun? Ich habe versucht, grep durch awk zu ersetzen, aber ohne Erfolg.
Danke.
Bearbeiten: Die Zeilen sind dynamisch und können sich ändern, wenn weitere Einträge zur Textdatei hinzugefügt werden. Daher kann sed nicht wirklich verwendet werden, um zur Zeile zu springen
Antwort1
Mit Einzelawk:
awk -v lbl=$labelNum '$1 == lbl{ print $2 }' temp.txt
-v lbl=$labelNum
- Übergabe deslabelNum
Variablenwerts an ein Awk-Skript$1 == lbl
- wenn der Wert der 1. Spalte gleich dem Variablenwert ist - führt den folgenden Ausdruck aus
Antwort2
Sie können auch bei Ihrer Lösung bleiben:
cat temp.txt | grep ^$labelNum | awk '{print $2}'
Welches passt am Anfang der Zeile, oder
awk '/^'$labelNum'/{print $2}' temp.txt
Würde genauso funktionieren, aber das Entkommen ist innerhalb von awk schwierig.