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.

4voto

Kaushal Jha Punkte 41
echo "1 2 3 4 5 6" | awk '{ $NF = ""; print $0}'

hier wird awk verwendet, um alles außer dem letzten Feld zu drucken

3voto

Manuel Parra Punkte 103

Das ist das, was ich von allen Empfehlungen bevorzugt habe:

Druck von der 6. bis zur letzten Spalte.

ls -lthr | awk '{out=$6; for(i=7;i<=NF;i++){out=out" "$i}; print out}'

oder

ls -lthr | awk '{ORS=" "; for(i=6;i<=NF;i++) print $i;print "\n"}'

2voto

Ed Morton Punkte 170552

Alle anderen Antworten, die hier und in verlinkten Fragen gegeben werden, scheitern auf unterschiedliche Weise bei verschiedenen möglichen FS-Werten. Einige lassen führende und/oder nachgestellte Leerzeichen, einige konvertieren jeden FS in den OFS, einige verlassen sich auf eine Semantik, die nur gilt, wenn FS der Standardwert ist, einige verlassen sich auf die Negierung von FS in einem Klammerausdruck, der bei einem mehrstelligen FS fehlschlägt, usw.

Um dies robust für jede FS zu tun, verwenden Sie GNU awk für das 4. arg an split():

$ cat tst.awk
{
    split($0,flds,FS,seps)
    for ( i=n; i<=NF; i++ ) {
        printf "%s%s", flds[i], seps[i]
    }
    print ""
}

$ printf 'a   b c    d\n' | awk -v n=3 -f tst.awk
c    d

$ printf ' a   b c    d\n' | awk -v n=3 -f tst.awk
c    d

$ printf ' a   b c    d\n' | awk -v n=3 -F'[ ]' -f tst.awk
  b c    d

$ printf ' a   b c    d\n' | awk -v n=3 -F'[ ]+' -f tst.awk
b c    d

$ printf 'a###b###c###d\n' | awk -v n=3 -F'###' -f tst.awk
c###d

$ printf '###a###b###c###d\n' | awk -v n=3 -F'###' -f tst.awk
b###c###d

Beachten Sie, dass ich split() oben verwende, weil das 3rg-Arg ein Feldtrenner und nicht nur ein Regexp wie das 2. Argument von match(). Der Unterschied besteht darin, dass Feldtrennzeichen im Vergleich zu Regexps eine zusätzliche Semantik haben, wie z. B. das Überspringen führender und/oder nachfolgender Leerzeichen, wenn das Trennzeichen ein einzelnes Leerzeichen ist - wenn Sie eine while(match())-Schleife oder irgendeine Form von *sub() verwenden wollten, um das oben genannte zu emulieren, müssten Sie Code schreiben, um diese Semantik zu implementieren, während split() sie bereits für Sie implementiert.

2voto

PlasmaBinturong Punkte 1728

Ich möchte die vorgeschlagenen Antworten auf die Situation ausdehnen, in der die Felder durch mögliche mehrere Leerzeichen -der Grund, warum der OP nicht mit cut Das nehme ich an.

Ich weiß, der Auftraggeber fragte nach awk sondern ein sed Ansatz würde hier funktionieren (Beispiel mit Druckspalten von der 5. bis zur letzten):

  • reiner Sed-Ansatz

      sed -r 's/^\s*(\S+\s+){4}//' somefile

    Erläuterung:

    • s/// ist der Standardbefehl zur Durchführung der Substitution
    • ^\s* passt auf alle aufeinanderfolgenden Leerzeichen am Anfang der Zeile
    • \S+\s+ bedeutet eine Datenspalte (Zeichen ohne Leerzeichen gefolgt von Leerzeichen)
    • (){4} bedeutet, dass das Muster 4 Mal wiederholt wird.
  • gesetzt und geschnitten

      sed -r 's/^\s+//; s/\s+/\t/g' somefile | cut -f5-

    indem Sie aufeinanderfolgende Leerzeichen einfach durch einen einzelnen Tabulator ersetzen;

  • tr und schneiden: tr kann auch verwendet werden, um aufeinanderfolgende Quetschungen Zeichen mit dem -s Option.

      tr -s [:blank:] <somefile | cut -d' ' -f5-

2voto

I159 Punkte 27156

Wenn Sie bestimmte Spalten mit beliebigen Begrenzungen drucken möchten:

awk '{print $3 "  " $4}'

col#3 col#4

awk '{print $3 "anything" $4}'

col#3irgendwascol#4

Wenn Sie also Leerzeichen in einer Spalte haben, sind es zwei Spalten, aber Sie können sie mit einem beliebigen Begrenzungszeichen oder ohne dieses verbinden.

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