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.

16voto

koullislp Punkte 480

Ich persönlich habe alle oben genannten Antworten ausprobiert, aber die meisten davon waren etwas kompliziert oder einfach nicht richtig. Am einfachsten ist es aus meiner Sicht:

awk -F" " '{ for (i=4; i<=NF; i++) print $i }'
  1. Wobei -F" " das Begrenzungszeichen definiert, das awk verwenden soll. In meinem Fall ist es das Leerzeichen, das auch das Standardbegrenzungszeichen für awk ist. Das bedeutet, dass -F" " ignoriert werden kann.

  2. wobei NF die Gesamtzahl der Felder/Spalten angibt. Daher beginnt die Schleife mit dem 4. Feld bis zum letzten Feld/Spalte.

  3. Wobei $N den Wert des N-ten Feldes abruft. Daher wird print $i das aktuelle Feld/die aktuelle Spalte auf der Grundlage der Schleifenzahl ausgeben.

11voto

ajendrex Punkte 129
awk '{ for(i=3; i<=NF; ++i) printf $i""FS; print "" }'

lauhub diese korrekte, einfache und schnelle Lösung vorgeschlagen ici

9voto

sdaau Punkte 34279

Das hat mich so sehr geärgert, dass ich mich hingesetzt und einen Brief geschrieben habe cut -ähnlicher Feldspezifikationsparser, getestet mit GNU Awk 3.1.7.

Erstellen Sie zunächst ein neues Awk-Bibliotheksskript namens pfcut mit z.B.

sudo nano /usr/share/awk/pfcut

Fügen Sie dann das folgende Skript ein und speichern Sie es. Danach sieht die Verwendung folgendermaßen aus:

$ echo "t1 t2 t3 t4 t5 t6 t7" | awk -f pfcut --source '/^/ { pfcut("-4"); }'
t1 t2 t3 t4

$ echo "t1 t2 t3 t4 t5 t6 t7" | awk -f pfcut --source '/^/ { pfcut("2-"); }'
t2 t3 t4 t5 t6 t7

$ echo "t1 t2 t3 t4 t5 t6 t7" | awk -f pfcut --source '/^/ { pfcut("-2,4,6-"); }'
t1 t2 t4 t6 t7

Um das alles nicht zu tippen, ist es wohl das Beste, was man tun kann (siehe sonst Automatisches Laden einer Benutzerfunktion beim Start mit awk? - Unix & Linux Stack Exchange ) ist das Hinzufügen eines Alias zu ~/.bashrc ; z.B. mit:

$ echo "alias awk-pfcut='awk -f pfcut --source'" >> ~/.bashrc
$ source ~/.bashrc     # refresh bash aliases

... dann können Sie einfach anrufen:

$ echo "t1 t2 t3 t4 t5 t6 t7" | awk-pfcut '/^/ { pfcut("-2,4,6-"); }'
t1 t2 t4 t6 t7

Hier ist die Quelle der pfcut Drehbuch:

# pfcut - print fields like cut
#
# sdaau, GNU GPL
# Nov, 2013

function spfcut(formatstring)
{
  # parse format string
  numsplitscomma = split(formatstring, fsa, ",");
  numspecparts = 0;
  split("", parts); # clear/initialize array (for e.g. `tail` piping into `awk`)
  for(i=1;i<=numsplitscomma;i++) {
    commapart=fsa[i];
    numsplitsminus = split(fsa[i], cpa, "-");
    # assume here a range is always just two parts: "a-b"
    # also assume user has already sorted the ranges
    #print numsplitsminus, cpa[1], cpa[2]; # debug
    if(numsplitsminus==2) {
     if ((cpa[1]) == "") cpa[1] = 1;
     if ((cpa[2]) == "") cpa[2] = NF;
     for(j=cpa[1];j<=cpa[2];j++) {
       parts[numspecparts++] = j;
     }
    } else parts[numspecparts++] = commapart;
  }
  n=asort(parts); outs="";
  for(i=1;i<=n;i++) {
    outs = outs sprintf("%s%s", $parts[i], (i==n)?"":OFS); 
    #print(i, parts[i]); # debug
  }
  return outs;
}

function pfcut(formatstring) {
  print spfcut(formatstring);
}

8voto

whaley Punkte 15747

Würde das funktionieren?

awk '{print substr($0,length($1)+1);}' < file

Es bleibt jedoch etwas Leerraum davor.

5voto

savvadia Punkte 191

Ausdruck von Spalten, beginnend mit der Nummer 2 (die Ausgabe wird ohne Leerzeichen am Anfang erfolgen):

ls -l | awk '{sub(/[^ ]+ /, ""); print $0}'

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