Ich habe eine Datei mit Spalten. Unten finden Sie ein Beispiel:
a b c ... z
1 2 3 ... 26
Ich möchte alle Spalten tauschen, in denen die erste zur letzten wird, die zweite zur vorletzten ... etc ..
z y x ... a
26 25 24 ... 1
Gibt es einen Einzeiler ( awk
oder sed
) der das macht?
Ich weiß, dass man es verwenden kann, awk
wenn nur ein paar Spalten vorhanden sind, aber ich möchte dies für Dateien mit Tausenden von Spalten tun können.
tac
macht dies perfekt für Linien.
Ich schätze, ich suche das Äquivalent für Spalten.
rev
hat bei mir nicht funktioniert, da es auch den Inhalt in der Spalte vertauscht.
text-processing
sed
awk
columns
user22519
quelle
quelle
perl -lane 'print join " ", reverse @F'
Antworten:
quelle
Sie könnten es mit einem kleinen Python-Skript tun:
quelle
Wenn Ihnen Python nichts ausmacht, kehrt dieser Einzeiler die Reihenfolge der durch Leerzeichen getrennten Spalten in jeder Zeile um:
Das obige funktioniert auch mit python2.7:
quelle
Ein Weg mit
awk
.Inhalt von
infile
:Führen Sie folgenden
awk
Befehl aus:Mit folgendem Ergebnis:
quelle
Dies ist langsam, hat aber eine Einlösungsfunktion. Die Breite von Feldtrennzeichen wird beibehalten, wenn diese breiter als ein einzelnes Zeichen sind. FWIW: Wenn Sie dieses Skript zweimal ausführen, ist das Ergebnis identisch mit dem Original.
Hier ist das Drehbuch.
Hier einige Zeitvergleiche. Die Testdatei enthielt 1 Zeile.
quelle
Sie können verwenden,
tac
Sie müssen nur die Eingabe vorher und nachher transponieren. Dies kann mit dem Tabellenkalkulationsrechnersc
und seinem Sidekick erfolgenpsc
:Wie gesehen hier .
Dies funktioniert am besten, wenn alle Spalten gefüllt sind.
im Ordner
outfile
Bearbeiten
Wie von PeterO festgestellt
sc
, ist die maximale Größe, die von dieser Methode unterstützt wird, auf 702 Spalten beschränkt.quelle
1
->1.00
. Außerdem erhalte ich Fehler für Zeilen, die breiter als 702 Felder sind. Es scheint sich auf ein numerisches Limit von 32768 zu beziehen ... aber es ist ziemlich schnell, wie es scheint.-S
zumpsc
Befehl sollte alles als Zeichenfolgen interpretieren. In Bezug auf die Spaltenbegrenzung von 702 ist dies eine harte Grenze, da nur Spalten von A bis ZZ unterstützt werden (26 + 26 * 26). Ich werde einen Kommentar dazu hinzufügen.Diese Pipeline ist um einen signifikanten Faktor schneller als die schnellste andere Antwort (siehe Ergebnisse). Es benutzt
tr
undtac
. Es müssen 2 ASCII-Bytes (\ x00- \ x7F) verwendet werden, die in Ihren Daten nicht vorhanden sind.\x00
ist normalerweise eine gute Wahl,\x01
aber Sie können jedes ASCII-Byte verwenden, das nicht in den Daten enthalten ist.In diesem Beispiel sind SPACE und TAB die Begrenzungszeichen. Begrenzer können aus mehreren Bytes oder aus einem Byte bestehen. Das Ausgabebegrenzungszeichen ist ein einzelnes Leerzeichen.
Hier ist der Befehl. Der Dateiname zeigt das
numberof fields
_xnumber of lines
Wenn Sie nach nicht verwendeten Bytes suchen möchten / müssen, können Sie dies vorher mit diesem optionalen
awk
Skript überprüfen . Die Gesamtzeit, auch wenn dieses optionale Skript ausgeführt wird, ist immer noch erheblich schneller als bei anderen Metoden (bisher :) .. Hier ist das Skript für die Vorverarbeitung.Dies ist das awk-Skript:
char-ascii-not-in-stream
Die zweite Gruppe von Zeiten für dieses Skript enthält
char-ascii-not-in-stream
die Uhrzeit.quelle
Sie können es auch ohne Druck machen f :
quelle