Menggabungkan 2 output yang berbeda dalam satu perintah?

15

Saya punya file seperti berikut:

1234
ABCD
EFGH

Saya ingin mengonversinya sebagai berikut:

2341
BCDA
FGHE

File sebenarnya memiliki 4.000 kata, jadi saya ingin melakukan ini secara efisien. Saya mencoba menggunakan perintah cut -c 2-4,1 file.txt, tetapi menghasilkan output yang persis sama dengan input. Saya berpikir saya bisa menggunakan 3 perintah berbeda:

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

... tapi saya lebih suka satu perintah karena saya perlu menjalankannya beberapa kali dengan sedikit modifikasi sehingga menjalankan satu perintah lebih rentan kesalahan daripada menjalankan 3 perintah setiap kali.

Apakah ada cara untuk menggabungkan pernyataan 2 potong menjadi satu? Sesuatu seperti:

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

Atau ada cara yang lebih baik untuk melakukan ini?

Masuk akal
sumber

Jawaban:

8

Menggunakan sed:

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

2341
BCDA
FGHE
llua
sumber
11

Dengan cutdan pasteAnda juga dapat melakukan one-liner:

$ cat file
1234
ABCD
EFGH
$ paste --delimiter=''  <(cut file -c2-4) <(cut file -c1)
2341
BCDA
FGHE
Bernhard
sumber
+1, untuk pintasan tempel. Itu mudah dimengerti. :)
Ankit
Anda juga dapat menggunakan -d ''alih-alih menggunakan --delimiters=''kembali karakter dari LIST alih-alih
TAB
4

Jika Anda menggunakan bash, gunakan pengindeksan string ekspansi parameter :

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

Anda dapat mengubah pemisah melalui "-F" sesuai dengan data Anda, dan mengatur urutan bidang secara sewenang-wenang.

Dejian
sumber
1

Inilah satu cara dengan perl:

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

Auto-split pada batas huruf, putar satu ke kiri dan cetak.

Thor
sumber
0

Saya menemukan alternatif dengan cara skrip:

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

Script memotong rantai dalam file yang terpisah. Kemudian gabung ke file baru (file4.txt) Dan akhirnya menghapus file cadangan.

solusi llua lebih bersih untuk seleraku.

Shugendo
sumber
-1

Sudahkah Anda mencoba rev?

~$ cat filename | rev

Karun
sumber
3
Lihatlah output sampel. Ini bukan kebalikan murni, tetapi pemikiran yang baik. Jika Anda tidak dapat menemukan cara untuk kembali bekerja ini, Anda mungkin harus menghapusnya, hanya agar tidak downvoted dan membingungkan utasnya.
slm