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.

0voto

Stuart Rothrock Punkte 38

Dies würde funktionieren, wenn Sie Bash verwenden, und Sie könnten so viele "x" wie Elemente verwenden, die Sie verwerfen möchten, und es ignoriert mehrere Leerzeichen, wenn sie nicht escaped werden.

while read x b; do echo "$b"; done < filename

0voto

pkm Punkte 2575

Perl:

@m=`ls -ltr dir | grep ^d | awk '{print \$6,\$7,\$8,\$9}'`;
foreach $i (@m)
{
        print "$i\n";

}

-1voto

Ich war nicht zufrieden mit einem der awk Lösungen, die hier vorgestellt wurden, weil ich die ersten paar Spalten extrahieren und dann den Rest ausdrucken wollte, also wandte ich mich an perl stattdessen. Der folgende Code extrahiert die ersten beiden Spalten und zeigt den Rest so an, wie er ist:

echo -e "a  b  c  d\te\t\tf g" | \
  perl -ne 'my @f = split /\s+/, $_, 3; printf "first: %s second: %s rest: %s", @f;'

Der Vorteil gegenüber dem perl Lösung von Chris Koknat ist, dass wirklich nur die ersten n Elemente von der Eingabezeichenkette abgetrennt werden; der Rest der Zeichenkette wird überhaupt nicht aufgetrennt und bleibt daher völlig intakt. Mein Beispiel demonstriert dies mit einer Mischung aus Leerzeichen und Tabulatoren.

Um die Anzahl der Spalten zu ändern, die extrahiert werden sollen, ersetzen Sie die 3 in dem Beispiel mit n+1.

-1voto

syntax Punkte 183

Wenn Sie formatierten Text wünschen, verketten Sie Ihre Befehle mit echo und verwenden Sie $0, um das letzte Feld zu drucken.

for i in {8..11}; do
   s1="$i"
   s2="str$i"
   s3="str with spaces $i"
   echo -n "$s1 $s2" | awk '{printf "|%3d|%6s",$1,$2}'
   echo -en "$s3" | awk '{printf "|%-19s|\n", $0}'
done

Drucke:

|  8|  str8|str with spaces 8  |
|  9|  str9|str with spaces 9  |
| 10| str10|str with spaces 10 |
| 11| str11|str with spaces 11 |

-1voto

arntg Punkte 1439
ls -la | awk '{o=$1" "$3; for (i=5; i<=NF; i++) o=o" "$i; print o }'

von diese Antwort ist nicht schlecht, aber die natürlichen Abstände sind nicht mehr vorhanden.
Bitte vergleichen Sie sie dann mit dieser:

ls -la | cut -d\  -f4-

Dann würden Sie den Unterschied sehen.

Sogar ls -la | awk '{$1=$2=""; print}' die sich auf die Antwort Am besten ist es bisher, die Formatierung nicht beizubehalten.

Ich würde also folgendes verwenden, und es erlaubt auch explizite selektive Spalten am Anfang:

ls -la | cut -d\  -f1,4-

Beachten Sie, dass jedes Leerzeichen auch für die Spalten zählt, so dass z. B. in der folgenden Abbildung die Spalten 1 und 3 leer sind, 2 ist INFO und 4 ist:

$ echo " INFO  2014-10-11 10:16:19  main " | cut -d\  -f1,3

$ echo " INFO  2014-10-11 10:16:19  main " | cut -d\  -f2,4
INFO 2014-10-11
$

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