461 Stimmen

Mit awk alle Spalten von der n-ten bis zur letzten Spalte ausgeben

Diese Zeile funktionierte, bis ich Leerzeichen im zweiten Feld hatte.

svn status | grep '\!' | gawk '{print $2;}' > removedProjs

Gibt es eine Möglichkeit, awk alles in $2 oder größer drucken zu lassen ($3, $4 bis wir keine Spalten mehr haben)?

Ich sollte wohl hinzufügen, dass ich dies in einer Windows-Umgebung mit Cygwin tue.

700voto

zed_0xff Punkte 31060

Alle Spalten drucken:

awk '{print $0}' somefile

Drucken Sie alle Spalten bis auf die erste Spalte:

awk '{$1=""; print $0}' somefile

Drucken Sie alle Spalten außer den ersten beiden aus:

awk '{$1=$2=""; print $0}' somefile

123voto

Joshua Goldberg Punkte 4405

Es gibt eine doppelte Frage mit einer einfachere Antwort mit Schnitt:

 svn status |  grep '\!' | cut -d\  -f2-

-d gibt die Begrenzung an (Leerzeichen) , -f gibt die Liste der Spalten an (alle beginnend mit der 2.)

122voto

VeeArr Punkte 5874

Sie könnten eine for-Schleife verwenden, um die Druckfelder $2 bis $NF (eingebaute Variable, die die Anzahl der Felder in der Zeile angibt) in einer Schleife zu drucken.

Bearbeiten: Da "print" einen Zeilenumbruch anhängt, sollten Sie die Ergebnisse zwischenspeichern:

awk '{out=""; for(i=2;i<=NF;i++){out=out" "$i}; print out}'

Alternativ dazu können Sie printf verwenden:

awk '{for(i=2;i<=NF;i++){printf "%s ", $i}; printf "\n"}'

31voto

Wim Punkte 487
awk '{out=$2; for(i=3;i<=NF;i++){out=out" "$i}; print out}'

Meine Antwort basiert auf die von VeeArr aber ich habe bemerkt, dass er mit einem Leerzeichen beginnt, bevor er die zweite Spalte (und den Rest) druckt. Da ich nur einen Rufpunkt habe, kann ich ihn nicht kommentieren, also kommt er als neue Antwort:

Beginnen Sie mit "out" als zweiter Spalte und fügen Sie dann alle anderen Spalten hinzu (sofern sie vorhanden sind). Das geht gut, solange es eine zweite Spalte gibt.

20voto

Die meisten Lösungen mit awk hinterlassen ein Leerzeichen. Die Optionen hier vermeiden dieses Problem.

Option 1

Eine einfache Lösung zum Ausschneiden (funktioniert nur mit einzelnen Begrenzungszeichen):

command | cut -d' ' -f3-

Option 2

Das Erzwingen einer awk-Neuberechnung entfernt manchmal das hinzugefügte führende Leerzeichen (OFS), das beim Entfernen der ersten Felder übrig bleibt (funktioniert mit einigen Versionen von awk):

command | awk '{ $1=$2="";$0=$0;} NF=NF'

Option 3

Drucken jedes Feldes, das mit printf wird mehr Kontrolle ermöglichen:

$ in='    1    2  3     4   5   6 7     8  '
$ echo "$in"|awk -v n=2 '{ for(i=n+1;i<=NF;i++) printf("%s%s",$i,i==NF?RS:OFS);}'
3 4 5 6 7 8

Alle vorherigen Antworten ändern jedoch alle wiederholten FS zwischen Feldern in OFS. Lassen Sie uns ein paar Optionen entwickeln, die das nicht tun.

Option 4 (empfohlen)

Eine Schleife mit Sub, um Felder und Begrenzungszeichen am Anfang zu entfernen.
Und die Verwendung des Wertes von FS anstelle des Leerzeichens (das geändert werden könnte).
Ist besser übertragbar und führt nicht zu einem Wechsel von FS zu OFS: HINWEIS: Die ^[FS]* ist es, eine Eingabe mit führenden Leerzeichen zu akzeptieren.

$ in='    1    2  3     4   5   6 7     8  '
$ echo "$in" | awk '{ n=2; a="^["FS"]*[^"FS"]+["FS"]+";
  for(i=1;i<=n;i++) sub( a , "" , $0 ) } 1 '
3     4   5   6 7     8

Option 5

Es ist durchaus möglich, eine Lösung zu entwickeln, die keine zusätzlichen (führenden oder nachgestellten) Leerzeichen hinzufügt und vorhandene Leerzeichen beibehält, indem man die Funktion gensub von GNU awk, als dies:

$ echo '    1    2  3     4   5   6 7     8  ' |
  awk -v n=2 'BEGIN{ a="^["FS"]*"; b="([^"FS"]+["FS"]+)"; c="{"n"}"; }
          { print(gensub(a""b""c,"",1)); }'
3     4   5   6 7     8 

Sie kann auch verwendet werden, um eine Gruppe von Feldern mit einer bestimmten Anzahl zu vertauschen n :

$ echo '    1    2  3     4   5   6 7     8  ' |
  awk -v n=2 'BEGIN{ a="^["FS"]*"; b="([^"FS"]+["FS"]+)"; c="{"n"}"; }
          {
            d=gensub(a""b""c,"",1);
            e=gensub("^(.*)"d,"\\1",1,$0);
            print("|"d"|","!"e"!");
          }'
|3     4   5   6 7     8  | !    1    2  !

Natürlich wird in diesem Fall das OFS verwendet, um die beiden Teile der Zeile zu trennen, und der hintere Leerraum der Felder wird weiterhin gedruckt.

HINWEIS: [FS]* wird verwendet, um führende Leerzeichen in der Eingabezeile zuzulassen.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X