Kết hợp 2 đầu ra cắt khác nhau trong một lệnh?


15

Tôi có một tập tin như sau:

1234
ABCD
EFGH

Tôi muốn chuyển đổi nó thành như sau:

2341
BCDA
FGHE

Các tập tin thực tế có 4.000 từ, vì vậy tôi muốn làm điều này một cách hiệu quả. Tôi đã thử sử dụng lệnh cut -c 2-4,1 file.txt, nhưng nó tạo ra đầu ra chính xác giống như đầu vào. Tôi đã nghĩ rằng tôi có thể sử dụng 3 lệnh khác nhau:

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

... nhưng tôi thích một lệnh đơn hơn vì tôi cần chạy nó nhiều lần với một chút sửa đổi nên việc chạy một lệnh sẽ ít bị lỗi hơn so với chạy 3 lệnh mỗi lần.

Có cách nào để kết hợp 2 câu lệnh cắt thành một không? Cái gì đó như:

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

Hoặc là có một cách tốt hơn để làm điều này?

Câu trả lời:


8

Sử dụng sed:

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

2341
BCDA
FGHE

11

Với cutpastebạn cũng có thể thực hiện một lớp lót:

$ cat file
1234
ABCD
EFGH
$ paste --delimiter=''  <(cut file -c2-4) <(cut file -c1)
2341
BCDA
FGHE

+1, cho phím tắt dán. Đó là điều dễ hiểu. :)
Ankit

Bạn cũng có thể chỉ sử dụng -d ''thay vì --delimiters=''sử dụng lại các ký tự từ LIST thay vì TAB
rubo77


3
$ cat test
1234
ABCD
EFGH
$ awk -F "" '{print $2$3$4$1}' test
2341
BCDA
FGHE

Bạn có thể thay đổi dấu phân cách thông qua "-F" theo dữ liệu của mình và sắp xếp thứ tự các trường tùy ý.


1

Đây là một cách với perl:

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

Tự động phân tách tại các ranh giới chữ cái, xoay một bên trái và in.


0

Tôi tìm thấy một sự thay thế theo cách viết kịch bản:

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

Kịch bản cắt các chuỗi trong một tệp riêng biệt. Sau đó tham gia vào một tệp mới (file4.txt) Và cuối cùng xóa các tệp dự phòng.

giải pháp llua sạch hơn cho khẩu vị của tôi.


-1

Bạn đã thử rev?

~$ cat filename | rev


3
Hãy nhìn vào đầu ra mẫu. Đó không phải là một sự đảo ngược thuần túy, nhưng suy nghĩ tốt. Nếu bạn không thể tìm ra cách để làm việc lại thì có lẽ bạn nên xóa nó đi, để nó không bị hạ cấp và gây nhầm lẫn cho chuỗi.
slm
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.