Ich möchte die letzte Spalte einer txt-Datei löschen, obwohl ich die Spaltennummer nicht kenne. Wie könnte ich das machen?
Beispiel:
Eingang:
1223 1234 1323 ... 2222 123
1233 1234 1233 ... 3444 125
0000 5553 3455 ... 2334 222
Und ich möchte, dass meine Ausgabe:
1223 1234 1323 ... 2222
1233 1234 1233 ... 3444
0000 5553 3455 ... 2334
text-processing
sed
awk
perl
zara
quelle
quelle
Antworten:
Mit
awk
:oder:
oder:
Obwohl dies wie Voodoo aussieht, funktioniert es. Jeder dieser awk-Befehle besteht aus drei Teilen.
Das erste ist
NF
, was eine Voraussetzung für den zweiten Teil ist.NF
ist eine Variable, die die Anzahl der Felder in einer Zeile enthält. In AWK sind die Dinge wahr, wenn sie nicht 0 oder eine leere Zeichenfolge sind""
. DaherNF
geschieht der zweite Teil (in dem dekrementiert wird) nur, wenn erNF
nicht 0 ist.Der zweite Teil (entweder
NF-=1
NF--
oder--NF
) subtrahiert nur einen von derNF
Variablen. Auf diese Weise wird verhindert, dass das letzte Feld gedruckt wird. Wenn Sie ein Feld ändern (in diesem Fall das letzte Feld entfernen), müssen Sie alle durch Leerzeichen getrennten Felderawk
neu erstellen$0
und verketten.$0
enthielt nicht mehr das letzte Feld.Der letzte Teil ist
1
. Es ist nicht magisch, es wird nur als Ausdruck verwendet, der bedeutettrue
. Wenn einawk
Ausdruck ohne zugeordnete Aktion als wahr ausgewertet wird,awk
lautet die Standardaktionprint $0
.quelle
--
. Ein Hinweis, den Sie derzeit;1
für POSIX-konform benötigen .,
Ihr Trennzeichen lautet:awk -F',' 'BEGIN { OFS = FS }; NF { NF -= 1 }; 1' < in > out
Verwendung
grep
mit PCRE:GNU benutzen
sed
:quelle
Perl benutzen:
Mit
rev
+cut
:quelle
Verwendung von GNU sed:
Im Allgemeinen funktioniert dies mit dem BSD sed in OSX sowie mit GNU sed:
quelle
Wenn das Trennzeichen immer ein einzelnes Zeichen ist (zwei oder mehr aufeinanderfolgende Trennzeichen kennzeichnen leere Felder), können Sie
head
nur die erste Zeile aus Ihrer Eingabedatei auswählen, die Trennzeichen zählen (n
Trennzeichen bedeutet Anzahl der Feldern+1
) und danncut
vom1
st-Feld aus drucken bis zumn
vorletzten Feld, zB bei tabulatorgetrennter Eingabe:oder zB mit einer csv datei:
Ich werde später einige Benchmarks durchführen, wenn ich Zeit habe, aber mit großem Input denke ich, dass diese Lösung schneller sein sollte als andere Lösungen, die Regex verwenden, da diese minimale Verarbeitung in der ersten Zeile vornimmt, um die Nr. Zu erhalten. von Feldern und dann verwendet,
cut
die für diesen Job optimiert ist.quelle
Portabel können Sie eine der folgenden Optionen verwenden:
quelle
Vim benutzen:
Datei in vim öffnen
Gehen Sie in die erste Zeile, nur für den Fall, dass sich der Cursor an einer anderen Stelle befindet.
Erstellen Sie ein Makro mit dem Namen „q“
qq
, die auf der Rückseite der aktuellen Zeile geht$
, dann geht zurück auf den letzten PlatzF
(Hauptstadt F, gefolgt von wörtlichen SPACE) , dann löschen Sie von der aktuellen Position durch ZeilenendeD
nach unten gehen in die nächste Zeilej
und Stoppen Sie die Makroaufnahme mitq
.Jetzt können wir unser Makro mit
@q
für jede Zeile wiederholen .Wir können auch drücken
@@
, um das letzte Makro zu wiederholen oder noch einfacher:um das Makro 99 Mal zu wiederholen.
Hinweis: Die Nummer muss nicht genau mit den Zeilen übereinstimmen.
quelle
Bei Personen mit ähnlichen Problemen, jedoch mit unterschiedlichen Feldtrennzeichen
awk
, wird das Feldtrennzeichen durch diese Methode korrekt beibehalten:quelle