So teilen Sie die Zeichenfolge, wenn sie Pipe-Symbole enthält |
. Ich möchte sie teilen, um im Array zu sein.
Ich habe es versucht
echo "12:23:11" | awk '{split($0,a,":"); print a[3] a[2] a[1]}'
Welches funktioniert gut. Wenn meine Zeichenfolge wie folgt "12|23|11"
ist, wie teile ich sie dann in ein Array auf?
OFS
, setzen Sie Kommas dazwischen, damitprint
sie als separate Argumente angezeigt werden.echo "12:23:11" | sed "s/.*://"
echo "12:23:11" | sed "s/.*://"
) löscht alles bis (und einschließlich) dem letzten ":", wobei nur die "11" beibehalten wird ... es funktioniert, um die letzte Nummer zu erhalten, müsste aber geändert werden (auf schwer lesbare Weise), um zu erhalten Die 2. Nummer usw. awk (und awks Split) ist viel eleganter und lesbarer.cut
Antworten:
Hast du es versucht:
quelle
split
regulärer Ausdruck und|
ein spezielles Symbol ist, das maskiert werden muss. Verwenden Siesplit($0, a, "\|")
|
dies als Zeichen und nicht als spezielles Symbol angesehen wird, besteht darin, es zwischen Folgendes zu setzen[]
: dhsplit($0, a, "[|]")
# Ich mag dies in einigen Fällen besser als '\ |', insbesondere als eine Variante von Regexp ( perl vs grep vs .. andere?) können "|" haben wörtlich interpretiert und "\ |" gesehen als Regex-Separator, anstelle des Gegenteils ... ymmvUm einen String in ein Array zu teilen, verwenden
awk
wir die Funktionsplit()
:Wenn kein Trennzeichen angegeben wird, wird das verwendet
FS
, das standardmäßig das Leerzeichen verwendet:Wir können ein Trennzeichen geben, zum Beispiel
:
:Was gleichbedeutend ist mit dem Einstellen durch
FS
:In gawk können Sie das Trennzeichen auch als regulären Ausdruck bereitstellen:
Und sehen Sie sogar, was der Begrenzer bei jedem Schritt war, indem Sie seinen vierten Parameter verwenden:
Zitieren wir die Manpage von GNU awk :
quelle
Bitte sei spezifischer! Was meinst du mit "es funktioniert nicht"? Veröffentlichen Sie die genaue Ausgabe (oder Fehlermeldung), Ihr Betriebssystem und Ihre awk-Version:
Oder mit split:
Bearbeiten: Unter Solaris müssen Sie POSIX awk ( / usr / xpg4 / bin / awk ) verwenden, um 4000 Felder korrekt zu verarbeiten.
quelle
for(i = 0
oderfor(i = 1
?for (i = 1; i <= n; ++i)
...Ich mag die
echo "..." | awk ...
Lösung nicht, da sie unnötigfork
und unnötig istexec
Systemaufrufe aufruft.Ich bevorzuge eine Dimiter-Lösung mit einer kleinen Wendung
Oder eine etwas kürzere Version:
In diesem Fall wird der Ausgabedatensatz zusammengestellt, was eine echte Bedingung ist, sodass er gedruckt wird.
In diesem speziellen Fall ist die
stdin
Umleitung durch das Einstellen von erspart werdenawk interne Variable:ich benutzte ksh eine ganze Weile, aber in BashDies könnte durch interne String-Manipulation verwaltet werden. Im ersten Fall wird die ursprüngliche Zeichenfolge durch den internen Terminator aufgeteilt. Im zweiten Fall wird angenommen, dass die Zeichenfolge immer Ziffernpaare enthält, die durch ein Ein-Zeichen-Trennzeichen getrennt sind.
Das Ergebnis ist in allen Fällen
quelle
bash
AusdruckHat tatsächlich
awk
eine Funktion namens 'Input Field Separator Variable' Link . So wird es benutzt. Es ist nicht wirklich ein Array, aber es verwendet die internen $ -Variablen. Zum Teilen einer einfachen Zeichenfolge ist es einfacher.quelle
sollte arbeiten.
quelle
quelle
Scherz? :) :)
Wie wäre es mit
echo "12|23|11" | awk '{split($0,a,"|"); print a[3] a[2] a[1]}'
Dies ist meine Ausgabe:
also ich denke es funktioniert doch ..
quelle
Ich weiß, dass dies eine alte Frage ist, aber ich dachte, vielleicht jemand wie mein Trick. Zumal diese Lösung nicht auf eine bestimmte Anzahl von Elementen beschränkt ist.
Die Ausgabe wird sein:
quelle