2017-08-04 1 views
1

Ich würde gerne wissen, wie man Spalten (das genaue Zeichen) einer Datei mit Linux vertauscht (mit cut, awk, sed oder was auch immer Sie mir helfen können). Ich habe gesehen, wie man einen ganzen Ausdruck (mit Trennzeichen) und ganze Wörter vertauscht.Swap Spalten einer Datei - Linux (genaue Position, kein Wort)

Beispiel:

128934 
38 2008 

Spalte Swapping 3 mit 5:

123984 
3802 08 

Ein anderer Weg, dies zu fragen, wäre mit dem 5. die 3. Zeichen jeder Zeile tauschen.

Antwort

1

Ein bisschen unhandlich, mit sed:

$ sed -E 's/^(..)(.)(.)(.)/\1\4\3\2/' infile 
123984 
3802 08 

Dies fängt die ersten fünf Zeichen jeder Zeile in vier Gruppen und dann ordnet sie. -E ist nur für die Bequemlichkeit da; ohne es müssen wir den Klammern entgehen wie in \(.\).

+0

Danke, das gut funktioniert. Das einzige Problem wäre in einer großen Datei, wenn ich den 30. Char mit dem 88. ändern wollte (nur ein Beispiel). Die Gruppe (..) in Ihrer Antwort wäre etwas wirklich großes wie (...... 29 Punkte ...), gibt es eine Möglichkeit, dies neu zu schreiben, anstatt viele Punkte zu machen? –

+0

'. {10}' ist z. B. zehn Zeichen. –

2

Sie können es mit gaffen, mawk, nawk und Busybox awk mit diesem nicht-Posix complient Beispiel:

awk -v FS='' -v OFS='' '{ t=$3; $3=$5; $5=t } 1' infile 

Ausgang:

123984 
3802 08 
+2

Sie sollten erwähnen, dass das nur mit GNU awk (vielleicht einigen anderen?) Funktionieren würde, da das Verwenden eines Null-Zeichens als FS zum Aufteilen in Zeichen ein undefiniertes Verhalten pro POSIX ist. gawk wird tun, was Sie wollen, aber einige andere werden definitiv nicht so YMMV, aber ist bei weitem der einfachste Ansatz, wenn Sie GNU-Tools haben. –

+0

@ EdMorton: Gut zu wissen. Ich habe es erfolgreich getestet mit: gawk, mawk, nawk und busybox awk – Thor

Verwandte Themen