2 verschiedene Schnittausgaben in einem einzigen Befehl kombinieren?

15

Ich habe eine Datei wie die folgende:

1234
ABCD
EFGH

Ich würde es gerne in folgendes konvertieren:

2341
BCDA
FGHE

Die eigentliche Datei enthält 4.000 Wörter, daher möchte ich dies auf effiziente Weise tun. Ich habe versucht, den Befehl zu verwenden cut -c 2-4,1 file.txt, aber er erzeugt genau die gleiche Ausgabe wie die Eingabe. Ich dachte, ich könnte 3 verschiedene Befehle verwenden:

cut -c 1 file.txt > temp1.txt
cut -c 2-4 file.txt > temp2.txt
// combine the two with paste or pr

... aber ich würde einen einzelnen Befehl vorziehen, da ich ihn mit geringfügigen Änderungen mehrmals ausführen muss, sodass das Ausführen eines Befehls weniger fehleranfällig ist als das Ausführen von 3 Befehlen jedes Mal.

Gibt es eine Möglichkeit, die beiden cut-Anweisungen zu einer zu kombinieren? Etwas wie:

cut -c 1 file.txt | pr (cut -c 2-4 file.txt)

Oder gibt es einen besseren Weg, dies zu tun?

Sinnvoll
quelle

Antworten:

8

Verwenden von sed:

sed 's:^\(.\)\(.*\):\2\1:' file.txt

2341
BCDA
FGHE
llua
quelle
11

Mit cutund können pasteSie auch einen Einzeiler machen:

$ cat file
1234
ABCD
EFGH
$ paste --delimiter=''  <(cut file -c2-4) <(cut file -c1)
2341
BCDA
FGHE
Bernhard
quelle
+1 für die Einfügeverknüpfung. Es ist leicht verständlich. :)
Ankit
Sie können auch einfach -d ''statt , --delimiters=''um Zeichen aus LISTE Wiederverwendung anstelle von Tabulatoren
rubo77
4

Wenn Sie bash verwenden, verwenden Sie die Zeichenfolgenindizierung der Parametererweiterung :

while IFS= read -r word; do
  echo "${word:1:3}${word:0:1}"
done < file.txt
Glenn Jackman
quelle
3
$ cat test
1234
ABCD
EFGH
$ awk -F "" '{print $2$3$4$1}' test
2341
BCDA
FGHE

Sie können das Trennzeichen über "-F" nach Ihren Angaben ändern und die Reihenfolge der Felder beliebig gestalten.

Dejian
quelle
1

Hier ist ein Weg mit perl:

perl -F'' -lane 'print @F[1..@F], $F[0]'

An den Buchstabengrenzen automatisch teilen, eine nach links drehen und drucken.

Thor
quelle
0

Ich habe eine Alternative in einem Skript gefunden:

~$ cut -c2- file.txt>file2.txt
~$ cut -c1 file.txt>file3.txt
~$ paste -d "" file2.txt file3.txt>file4.txt
~$ rm file2.txt file3.txt

Das Skript schneidet die Ketten in separate Dateien. Fügen Sie dann eine neue Datei (file4.txt) hinzu und entfernen Sie schließlich die Ersatzdateien.

die llua-lösung ist für meinen geschmack sauberer.

Shugendo
quelle
-1

Haben Sie versucht, rev?

~$ cat filename | rev

Karun
quelle
3
Schauen Sie sich die Beispielausgabe an. Es ist keine reine Umkehrung, sondern gutes Denken. Wenn Sie keine Möglichkeit finden, dies zu überarbeiten, sollten Sie es wahrscheinlich löschen, damit es nicht herabgestuft wird und den Thread verwirrt.
SLM