Ich habe eine Datei cities
wie diese:
[1598] San Diego, US (inactive)
[4517] St Louis, US (inactive)
[6346] Orlando, US (inactive)
Ich möchte die Städtenamen ausschneiden, damit ich:
San Diego
St Louis
Orlando
Dies ist das Beste, was ich mir einfallen lassen konnte:
cut -d ',' -f1 cities | cut -d ']' -f2
Aber das lässt mir immer noch ein Leerzeichen vor den Namen. Gibt es einen cut
ähnlichen Befehl, den ich verwenden kann, um Begrenzer mit mehreren Zeichen zu akzeptieren, damit ich ihn einschränken kann ]
?
command-line
cut
Kit Sunde
quelle
quelle
tr
ist nützlich zum Löschen von Zeichen, die Sie nicht möchten.(inactive)
Status oder nicht? Bitte geben Sie eine Beispielausgabe an.cut
Dinge ausschneide und Sie die Absicht des fehlgeschlagenen Beispiels sehen können, sollte es im Kontext ziemlich klar sein. Ich werde jedoch eine Probe zur Verfügung stellen, um es weiter zu klären. :)Antworten:
Awk ( siehe auch Awk Info ) ist wunderschön mit solchen Fragen. Versuchen:
Dies definiert ein Feldtrennzeichen
-F
als[],] *
- was bedeutet, dass entweder eine schließende eckige Klammer oder ein Komma vorkommt, gefolgt von Null oder einer beliebigen Anzahl von Leerzeichen. Natürlich können Sie dies nach Bedarf ändern. Informieren Sie sich über reguläre Ausdrücke.Sobald die Linie geteilt ist, können Sie mit dem Teilungsergebnis tun, was Sie wollen. Hier habe ich beschlossen, das zweite Feld nur mit auszudrucken
print $2
. Beachten Sie, dass es wichtig ist, die awk-Anweisungen in einfache Anführungszeichen zu setzen, da ansonsten $ 2 durch die Shell ersetzt wird.quelle
]
ist keine spitze Klammer. Spitze Klammern sind<>
.[]
sind "eckige Klammern" oder nur "Klammern".Sie können den letzten
cut
in Ihrer Pipeline folgendermaßen ändern :Das obige bedeutet, dass das Feldtrennzeichen ein Leerzeichen ist, und wir möchten alle Felder ab dem zweiten auswählen. Die komplette Sequenz wird:
quelle
Für eine komplexere Analyse sollten Sie sed (1) verwenden :
Oder verwenden Sie
-r
, um den regulären Ausdruck zu vereinfachen, wie von pepoluan vorgeschlagen :quelle
Normalerweise benutze ich Perl, wenn es für sed und grep zu schwierig wird.
Es gibt verschiedene Möglichkeiten, wie Sie es in Perl schreiben können. Beispielsweise möchten Sie möglicherweise, dass es schnell ist, oder Sie möchten möglicherweise, dass geringfügige unerwartete Probleme bei der Eingabe behoben werden (z. B. zwei Leerzeichen, bei denen eines erwartet wurde).
Ein offensichtlicher Weg (setzt voraus, dass die ID numerisch, die Stadt alphabetisch und der Status alphabetisch ist):
Oder langsamer, aber freizügiger (macht mehr Backtracking):
Oder schneller (Feld stoppt beim ersten Auftreten der schließenden Klammer):
Anstelle eines Skripts können Sie von der Befehlszeile aus die
-n
Option verwenden, die im Grunde diewhile (<>) { BLOCK }
Schleife hinzufügt :oder wenn Sie möchten, dass die Verwendung wie bei cut aussieht, können Sie die
-F
Option verwenden, die der von awk ähnelt.-F
Beispiel:Auf diese Weise wird offensichtlich davon ausgegangen, dass kein Feld eines der Begrenzer enthält.
quelle