Ich versuche, die ersten beiden Spalten (von denen ich nicht interessiert bin) aus einer DbgView-Protokolldatei zu entfernen. Ich kann anscheinend kein Beispiel finden, das ab Spalte 3 bis zum Ende der Zeile gedruckt wird. Beachten Sie, dass jede Zeile eine variable Anzahl von Spalten hat.
linux
shell
unix
multiple-columns
Amit G.
quelle
quelle
Antworten:
... oder eine einfachere Lösung:
cut -f 3- INPUTFILE
Fügen Sie einfach das richtige Trennzeichen (-d) hinzu und Sie haben den gleichen Effekt.quelle
quelle
awk '{for(i=3;i<=NF;++i)printf $i""FS ; print ""}'
(printf
druckt das Zeilenumbruchzeichen nicht, währendprint ""
Zeilenumbruch hinzugefügt wird, nachdem die anderen Felder gedruckt wurden)echo $(seq 1 10) | awk '{for (i=3; i<=NF; i++) printf $i FS}'
, was gibt :3 4 5 6 7 8 9 10
.Lösung hier gefunden:
http://www.linuxquestions.org/questions/linux-newbie-8/awk-print-field-to-end-and-character-count-179078/
quelle
Die Antwort von Jonathan Feinberg druckt jedes Feld in einer separaten Zeile. Sie können
printf
den Datensatz für die Ausgabe in derselben Zeile neu erstellen, aber Sie können die Felder auch einfach einen Sprung nach links verschieben.quelle
NF
ist von POSIX nicht zulässig.NF
es dekrementiert werden kann.NB: Diese Methode hinterlässt "Leerzeichen" in 1,2,3-Feldern, ist jedoch kein Problem, wenn Sie nur die Ausgabe betrachten möchten.
quelle
1
? Mit welchem Schlüsselwort soll ich suchenawk
?{$1=$2=$3="";$0=$0;$1=$1}1
Wenn Sie die Spalten nach dem 3. beispielsweise in derselben Zeile drucken möchten, können Sie Folgendes verwenden:
Beispielsweise:
Es wird gedruckt:
Wie wir sehen können, wird die Gehaltsabrechnung auch bei Leerzeichen in der richtigen Zeile angezeigt.
quelle
Was ist mit der folgenden Zeile:
Basierend auf dem Vorschlag von @ ghostdog74. Meins sollte sich besser verhalten, wenn Sie Linien filtern, dh:
quelle
sed 's/\s\+//g'
am Ende des Befehls Pipe & Add hinzufügen , um führende Leerzeichen zuDies 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 angezeigt wird, was das Problem mit Daisaas Antwort ist.
Definieren Sie eine Funktion:
Und benutze es so:
Die Ausgabe behält alles bei, einschließlich nachfolgender Leerzeichen
Funktioniert gut für Dateien, in denen '/ n' das Datensatztrennzeichen ist, sodass Sie das Zeichen für neue Zeilen nicht in den Zeilen haben. Wenn Sie es mit anderen Datensatztrennzeichen verwenden möchten, verwenden Sie:
beispielsweise. Funktioniert gut mit fast allen Dateien, solange sie kein hexadezimales Zeichen nr verwenden. 1 innerhalb der Zeilen.
quelle
Der folgende Befehl awk druckt die letzten N Felder jeder Zeile und am Ende der Zeile ein neues Zeilenzeichen:
Nachfolgend finden Sie ein Beispiel, das den Inhalt des Verzeichnisses / usr / bin auflistet, die letzten 3 Zeilen enthält und dann die letzten 4 Spalten jeder Zeile mit awk druckt:
quelle
Zuerst finden Sie die Position des Anfangs der dritten Spalte. Mit substr drucken Sie die gesamte Zeile ($ 0) beginnend an der Position (in diesem Fall a) bis zum Ende der Zeile.
quelle
Nun, Sie können den gleichen Effekt leicht mit einem regulären Ausdruck erzielen. Angenommen, das Trennzeichen ist ein Leerzeichen, würde es so aussehen:
quelle
awk '{ sub(/([^ ]+ +){2}/, ""); print }'
Das Muster wird zweimal entfernt.quelle
Perl-Lösung:
Diese Befehlszeilenoptionen werden verwendet:
-n
Schleife um jede Zeile der Eingabedatei, drucke nicht automatisch jede Zeile-l
Entfernt Zeilenumbrüche vor der Verarbeitung und fügt sie anschließend wieder hinzu-a
Autosplit-Modus - Teilen Sie die Eingabezeilen in das @ F-Array. Standardmäßig wird auf Leerzeichen aufgeteilt-e
Führen Sie den Perl-Code aussplice @F,0,2
Entfernt sauber die Spalten 0 und 1 aus dem @ F-Arrayjoin " ",@F
Verbindet die Elemente des @ F-Arrays mit einem Leerzeichen zwischen den einzelnen ElementenWenn Ihre Eingabedatei durch Kommas und nicht durch Leerzeichen getrennt ist, verwenden Sie
-F, -lane
Python-Lösung:
python -c "import sys;[sys.stdout.write(' '.join(line.split()[2:]) + '\n') for line in sys.stdin]" < file
quelle
Ein bisschen spät hier, aber keines der oben genannten schien zu funktionieren. Versuchen Sie dies, indem Sie mit printf Leerzeichen dazwischen einfügen. Ich habe mich entschieden, am Ende keine Newline zu haben.
quelle
Druckt Datensätze vom 4. bis zum letzten Feld in derselben Reihenfolge wie in der Originaldatei
quelle
In Bash können Sie die folgende Syntax mit Positionsparametern verwenden:
Weitere Informationen : Umgang mit Positionsparametern im Bash Hackers Wiki
quelle
Wenn es nur darum geht, die ersten beiden Felder zu ignorieren, und wenn Sie beim Maskieren dieser Felder kein Leerzeichen möchten (wie dies bei einigen der obigen Antworten der Fall ist):
quelle
Die ersten beiden Spalten werden gelöscht und
sed
führende Leerzeichen entfernt.quelle
In AWK werden Spalten als Felder bezeichnet, daher ist NF der Schlüssel
alle Zeilen:
Nur erste Reihe:
quelle