ein paar leichte Verfeinerungen:awk -v N=9 '{sep=""; for (i=N; i<=NF; i++) {printf("%s%s",sep,$i); sep=OFS}; printf("\n")}'
Glenn Jackman
Danke @glenn, das ist in der Tat etwas allgemeiner. Wie auch immer - ich würde auf jeden Fall zustimmen , es wäre besser zu nutzen cutoder perldafür. Verwenden Sie dies nur, wenn Sie wirklich darauf bestehen, es zu haben awk.
Amadan
1
@SiegeX: Es werden keine NUL-Bytes hinzugefügt, sondern der FS bleibt zwischen den einzelnen leeren Feldern erhalten.
Bis auf weiteres angehalten.
1
Die Eleganz finden Sie in der Antwort von @ Ascherer.
3
@veryhungrymike: Eleganz ist nett, aber ich würde lieber richtig sein. : p
Amadan
68
Wenn Sie eine Reihe von Feldern ausführen möchten, awkhaben Sie keine direkte Möglichkeit, dies zu tun. Ich würde cutstattdessen empfehlen :
cut -d' '-f 9-./infile
Bearbeiten
Leerzeichen-Feldbegrenzer hinzugefügt, da standardmäßig eine Registerkarte ist. Vielen Dank an Glenn für diesen Hinweis
Eine Sache beim Ausschneiden ist, dass es ein bestimmtes Trennzeichen verwendet (standardmäßig Registerkarte), wobei awk "Leerzeichen" verwendet. Beim Ausschneiden begrenzen 2 aufeinanderfolgende Registerkarten ein leeres Feld.
Glenn Jackman
1
Wie @glennjackman betonte, ist das Trennzeichen von awk "Leerzeichen" (auch ein beliebiger Betrag). Das Setzen des Schnitttrennzeichens auf ein einzelnes Leerzeichen würde also auch nicht zum Verhalten passen. Leider ist die Schleife die beste, die man machen kann, also sieht es so aus.
Poncha
Dieser funktioniert nicht richtig. Versuchen Sie den Befehl find . | xargs ls -l | cut -d' ' -f 9-. Aus irgendeinem Grund werden auch doppelte Leerzeichen gezählt. Beispiel: lrwxrwxrwx 1 me me 21 Dec 12 00:00 ./file_a lrwxrwxrwx 1 me me 64 Dec 6 00:06 ./file_bführt zu./file_a 00:06 ./file_b
Marco Pashkov
@MarcoPashkov Bitte erläutern Sie dies. Dieser funktioniert nicht richtig , insbesondere wenn Sie genau den gleichen Code in Ihrer Pipeline verwenden. Übrigens sollten Sie niemals versuchen, die Ausgabe von ls
SiegeX am
Schnitt macht hier nicht den Job. Wenn Ihre Eingabe beispielsweise "foo bar" (einzelnes Leerzeichen) für eine Zeile und "foo ___ bar" (dh mehrere Leerzeichen, aber SO ist zu intelligent, um sie anzuzeigen) für eine andere Zeile lautet, werden sie beim Ausschneiden anders verarbeitet.
UKMonkey
53
awk '{print substr($0, index($0,$9))}'
Bearbeiten : Beachten Sie, dass dies nicht funktioniert, wenn ein Feld vor dem neunten den gleichen Wert wie das neunte enthält.
@veryhungrymike: ... und funktioniert nicht, wenn ein Feld vor dem neunten den gleichen Wert wie das neunte enthält.
Amadan
6
Wahrscheinlich wegen des klassischen Satzes "Hoffentlich hat Ihre Datei dieses Problem nicht". Es ist ein absolutes No-No in der S / W-Technik zu sagen: "Wir werden keine Zeit damit verschwenden, Fehler zu überprüfen, um beispielsweise negative Werte einzugeben, denn 'wir hoffen, dass der Benutzer intelligent genug ist, um sie nicht auszuprobieren." Absturz unseres Werkzeugs '". HAHAHA! Ich liebe es immer das zu hören! (I wie ein guter Sinn für Humor) Nun, wie Idioten tun exist, dann ist es die Pflicht der Entwickler seine Sachen zu machen idiotensicher ! Anstatt "auf das Gute im Menschen zu hoffen". Das ist eher eine Einstellung, die von Philosophen erwartet wird, nicht von s / w-Ingenieuren ... LOL
Syntaxfehler
3
Ich habe nicht gesagt, nicht nach Fehlern zu suchen, aber wenn Sie wissen, dass Sie nicht auf das Problem stoßen werden, ist diese Lösung in Ordnung, wie ich bereits sagte. Aber danke für die unnötige Ablehnung @syntaxerror. Diese Lösung funktioniert für einige, wie die (derzeit) 19 Upvotes zeigen, aber wenn dies nicht der Fall ist, verwenden Sie sie nicht für Ihre Lösung. Es gibt viele Möglichkeiten, das Problem des OP zu lösen.
Ascherer
1
Wenn Sie awk in Ihrer täglichen Arbeit in der Befehlszeile verwenden, ist dies definitiv die gewünschte Lösung. Ist es nicht offensichtlich? Fehlerprüfung usw. spielt in diesem Fall keine Rolle, da Sie sie eingeben und diese Art von Dingen abfangen können, bevor Sie die Eingabetaste drücken (ich persönlich denke nicht, dass awk für irgendetwas anderes verwendet werden sollte, deshalb wir Ich habe Perl, Python, Tcl und über 100 andere, bessere, schnellere, weniger nervige Skriptsprachen!) Natürlich gebe ich meinen Kollegen von Softwareentwicklern zu viel Anerkennung und sie müssen wirklich Fehler überprüfen, selbst wenn sie etwas eingeben on the fly (??)
Osirisgothra
11
sed -re 's,\s+, ,g'| cut -d ' '-f 9-
Ersetzen Sie anstelle von Leerzeichen mit variabler Breite alle Leerzeichen als einzelne Leerzeichen. Dann verwenden Sie einfach cutmit den Feldern von Interesse.
Es verwendet kein awk, ist also nicht deutsch, schien aber angesichts der anderen Antworten / Kommentare angemessen.
Sie müssen die Befehlszeilenoption hinzufügen -loder \nder print-Anweisung hinzufügen .
Glenn Jackman
@ Glenn Jackman: Möglicherweise. Nicht erforderlich, wenn ein Teil einer anderen Nachricht oder eine Variable usw. zugewiesen ist. Was "besser" betrifft, sieht Perl im Kleinen sicherlich besser aus. Kann zugegebenermaßen im Großen sehr unordentlich aussehen.
Bobbogo
Versteh mich nicht falsch, ich mag Perl. Ich liebe awk für das, was es ist.
Glenn Jackman
Mein eingebettetes Gerät kommt nicht mit Perl, aber es hat awk.
Sepero
Downvoting, weil die Frage lautete, wie man das in awk macht, nicht in perl, ruby, java, python, bash.
Dies zerhackt, was vor dem angegebenen Feld nr., N steht, und druckt den gesamten Rest der Zeile, einschließlich Feld nr.N, und behält den ursprünglichen Abstand bei (es wird nicht neu formatiert). Es spielt keine Rolle, ob die Zeichenfolge des Feldes auch an einer anderen Stelle in der Zeile erscheint, was das Problem mit Ascherers Antwort ist.
$ echo " bat bi iru lau bost "| fromField 3
iru lau bost
$ echo " bat bi iru lau bost "| fromField 2
bi iru lau bost
Die Ausgabe behält alles bei, einschließlich nachfolgender Leerzeichen. Für N = 0 wird die gesamte Zeile unverändert und für n> NF die leere Zeichenfolge zurückgegeben
Das ist eine gute Idee. Auf einem aktuellen Mac mit typischem Gawk funktioniert es nicht ganz, da $ 0 zusammenbricht. Die Lösung besteht darin, als ersten Schritt eine Variable auf $ 0 zu setzen, z. B.: '{S = $ 0; ... drucke substr (s, index (s, m) +1}
Verwenden Sie cut anstelle von awk und überwinden Sie Probleme mit dem Befehl -c cut cut, um herauszufinden, bei welcher Spalte Sie beginnen sollen.
Hier sage ich, gib mir alle bis auf die ersten 49 Zeichen der Ausgabe.
ls -l /some/path/*/*| cut -c 50-
Das /*/*/ Befehl am Ende des Befehls ls zeigt an, was sich auch in Unterverzeichnissen befindet.
Sie können auch bestimmte Zeichenbereiche herausziehen (aus der Manpage zum Ausschneiden). Zeigen Sie beispielsweise die Namen und Anmeldezeiten der aktuell angemeldeten Benutzer an:
Antworten:
quelle
awk -v N=9 '{sep=""; for (i=N; i<=NF; i++) {printf("%s%s",sep,$i); sep=OFS}; printf("\n")}'
cut
oderperl
dafür. Verwenden Sie dies nur, wenn Sie wirklich darauf bestehen, es zu habenawk
.Wenn Sie eine Reihe von Feldern ausführen möchten,
awk
haben Sie keine direkte Möglichkeit, dies zu tun. Ich würdecut
stattdessen empfehlen :Bearbeiten
Leerzeichen-Feldbegrenzer hinzugefügt, da standardmäßig eine Registerkarte ist. Vielen Dank an Glenn für diesen Hinweis
quelle
find . | xargs ls -l | cut -d' ' -f 9-
. Aus irgendeinem Grund werden auch doppelte Leerzeichen gezählt. Beispiel:lrwxrwxrwx 1 me me 21 Dec 12 00:00 ./file_a lrwxrwxrwx 1 me me 64 Dec 6 00:06 ./file_b
führt zu./file_a 00:06 ./file_b
Bearbeiten : Beachten Sie, dass dies nicht funktioniert, wenn ein Feld vor dem neunten den gleichen Wert wie das neunte enthält.
quelle
Ersetzen Sie anstelle von Leerzeichen mit variabler Breite alle Leerzeichen als einzelne Leerzeichen. Dann verwenden Sie einfach
cut
mit den Feldern von Interesse.Es verwendet kein awk, ist also nicht deutsch, schien aber angesichts der anderen Antworten / Kommentare angemessen.
quelle
ps faux |
Einsatz. Haben Sie niemals Angst, das Tool XYZ zuzulassen, das nicht am besten geeignet ist.Im Allgemeinen ersetzt Perl awk / sed / grep et. al. und ist viel tragbarer (und einfach nur ein besseres Taschenmesser).
Timtowtdi gilt natürlich.
quelle
-l
oder\n
der print-Anweisung hinzufügen .Dies zerhackt, was vor dem angegebenen Feld nr., N steht, und druckt den gesamten Rest der Zeile, einschließlich Feld nr.N, und behält den ursprünglichen Abstand bei (es wird nicht neu formatiert). Es spielt keine Rolle, ob die Zeichenfolge des Feldes auch an einer anderen Stelle in der Zeile erscheint, was das Problem mit Ascherers Antwort ist.
Definieren Sie eine Funktion:
Und benutze es so:
Die Ausgabe behält alles bei, einschließlich nachfolgender Leerzeichen. Für N = 0 wird die gesamte Zeile unverändert und für n> NF die leere Zeichenfolge zurückgegeben
quelle
Hier ist ein Beispiel für die
ls -l
Ausgabe:Meine Lösung, um irgendetwas zu drucken,
$9
istawk '{print substr($0, 61, 50)}'
quelle
quelle
So zeigen Sie die ersten 3 Felder an und drucken die verbleibenden Felder aus:
Dabei sind $ 1 $ 2 $ 3 die ersten 3 Felder.
quelle
quelle
Verwenden Sie cut anstelle von awk und überwinden Sie Probleme mit dem Befehl -c cut cut, um herauszufinden, bei welcher Spalte Sie beginnen sollen.
Hier sage ich, gib mir alle bis auf die ersten 49 Zeichen der Ausgabe.
Das
/*/*/
Befehl am Ende des Befehls ls zeigt an, was sich auch in Unterverzeichnissen befindet.Sie können auch bestimmte Zeichenbereiche herausziehen (aus der Manpage zum Ausschneiden). Zeigen Sie beispielsweise die Namen und Anmeldezeiten der aktuell angemeldeten Benutzer an:
quelle