Định dạng văn bản thành các cột


11

Tôi có một tệp có hai cột như hình dưới đây (ví dụ):

TẬP 1:

John 1
Peter 2
Michael Rod 3
Su 7
Louise 9

Tôi cần định dạng này và đầu ra dự kiến ​​của tôi sẽ là:

TẬP 1:

John        1
Peter       2
Michael Rod 3
Su          7
Louise      9

1
2 cột ở đâu?
marc

Cả hai đầu ra dường như là như nhau. Bạn có thể vui lòng cho biết thêm chi tiết về câu hỏi của bạn?

2
Cột được định nghĩa như thế nào? Có một tab hoặc một số ký tự khác giữa tên và số? Làm thế nào chúng ta có thể biết đó Michael Rod 3là 2 cột chứ không phải 3?
terdon

2
Không, không đăng hình ảnh của văn bản . Tôi chỉ cần sao chép và dán văn bản đó để có thể giúp bạn, và bây giờ tôi không thể.
Kusalananda

1
ditto những gì mmmint và terdon nói; bạn có thể chỉ định, ví dụ, đó là cột cuối cùng cần được thụt vào để cho phép độ rộng của dòng dài nhất không?
Jeff Schaller

Câu trả lời:


18

Nếu đầu vào chỉ có hai cột, tôi đã đề nghị sử dụng column -t. Điều này không hoàn toàn hoạt động ở đây mặc dù vì columntiện ích sẽ coi bất kỳ số lượng khoảng trắng hoặc tab nào là dấu phân cách cột:

$ column -t file1
John     1      
Peter    2      
Michael  Rod  3 
Su       7      
Louise   9      

"Michael Rod" là hai cột, do đó, một hàng có nhiều hơn một cột so với các hàng khác, làm rối loạn đầu ra.

Chúng ta có thể giải quyết vấn đề này bằng cách chèn một ký tự tab trước cột cuối cùng và sau đó cho phép columnsử dụng (chỉ) làm dấu phân cách:

$ awk '{ $NF = "\t" $NF; print }' file1 | column -t -s $'\t'
John          1
Peter         2
Michael Rod   3
Su            7
Louise        9

Trong Awk, NFlà số lượng trường (cột) và $NFlà dữ liệu trong trường cuối cùng. Tập lệnh tôi đang sử dụng chỉ đơn giản là sửa đổi dữ liệu của trường cuối cùng bằng cách thêm vào một ký tự tab, trước khi in dòng hoàn chỉnh.

Nếu trình bao của bạn không hiểu $'\t', thì bạn có thể chọn một ký tự khác không phải là một phần của dữ liệu:

awk '{ $NF = "@" $NF; print }' file1 | column -t -s '@'
John          1
Peter         2
Michael Rod   3
Su            7
Louise        9
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.