Łączenie 2 różnych wyników cięcia w jednym poleceniu?

15

Mam plik taki jak poniżej:

1234
ABCD
EFGH

Chciałbym przekonwertować to na następujące:

2341
BCDA
FGHE

Rzeczywisty plik ma 4000 słów, więc chciałbym to zrobić w wydajny sposób. Próbowałem użyć polecenia cut -c 2-4,1 file.txt, ale daje on dokładnie takie same dane wyjściowe jak dane wejściowe. Myślałem, że mogę użyć 3 różnych poleceń:

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

... ale wolałbym jedno polecenie, ponieważ muszę je uruchomić kilka razy z niewielkimi modyfikacjami, więc wykonanie jednego polecenia jest mniej podatne na błędy niż uruchomienie 3 poleceń za każdym razem.

Czy jest jakiś sposób na połączenie 2 ciętych instrukcji w jedno? Coś jak:

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

Czy jest na to lepszy sposób?

Rozsądny
źródło

Odpowiedzi:

8

Używanie sed:

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

2341
BCDA
FGHE
llua
źródło
11

Za pomocą cuti pastemożesz również zrobić jedno-liniowy:

$ cat file
1234
ABCD
EFGH
$ paste --delimiter=''  <(cut file -c2-4) <(cut file -c1)
2341
BCDA
FGHE
Bernhard
źródło
+1, dla skrótu wklejania. Jest to zrozumiałe. :)
Ankit
Można też po prostu użyć -d ''zamiast --delimiters=''do ponownego użycia znaków z listy zamiast JOT
rubo77
4

Jeśli używasz bash, użyj indeksowania ciągów rozwijania parametrów :

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

Możesz zmienić separator za pomocą „-F” stosownie do swoich danych i dowolnie uporządkować kolejność pól.

Dejian
źródło
1

Oto jeden sposób z perl:

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

Automatyczne dzielenie na granicach liter, obracaj jeden w lewo i drukuj.

Thor
źródło
0

Znalazłem alternatywę w sposób skryptowy:

~$ 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

Skrypt odcina łańcuchy w osobnych plikach. Następnie dołącz do nowego pliku (file4.txt) I w końcu usuwa zapasowe pliki.

roztwór Llua jest bardziej czysty jak na mój gust.

Shugendo
źródło
-1

Czy próbowałeś rev?

~$ cat filename | rev

Karun
źródło
3
Spójrz na przykładowe wyjście. To nie jest czysta odwrotność, ale dobre myślenie. Jeśli nie możesz wymyślić sposobu, aby to przerobić, prawdopodobnie powinieneś go usunąć, aby nie przegłosował i nie pomylił wątku.
slm