Ngoài việc đưa ra một giải pháp tùy chỉnh để hoán chuyển các hàng với các cột từ một dòng lệnh, công cụ duy nhất tôi từng thấy có thể làm điều này là một công cụ gọi là trớ trêu transpose
.
Cài đặt
Thật không may, nó không có trong bất kỳ repo nào vì vậy bạn sẽ cần phải tải xuống và biên dịch nó. Điều này khá đơn giản vì nó không có thư viện bổ sung mà nó phụ thuộc vào. Nó có thể được thực hiện như vậy:
$ gcc transpose.c -o transpose
Sử dụng
Nó có thể xử lý các tập tin văn bản đơn giản dễ dàng. Ví dụ:
$ cat simple.txt
X column1 column2 column3
row1 0 1 2
row2 3 4 5
row3 6 7 8
row4 9 10 11
Có thể được chuyển đổi bằng lệnh này:
$ transpose -t --fsep " " simple.txt
X row1 row2 row3 row4
column1 0 3 6 9
column2 1 4 7 10
column3 2 5 8 11
Lệnh này là transpose
transpose ( -t
) và dấu tách trường sẽ sử dụng là khoảng trắng ( --fsep " "
).
Ví dụ của bạn
Vì dữ liệu mẫu của bạn có định dạng phức tạp hơn một chút, nó cần được xử lý theo 2 giai đoạn. Đầu tiên chúng ta cần dịch nó sang một định dạng transpose
có thể xử lý.
Chạy lệnh này, sẽ đặt dữ liệu theo định dạng thân thiện hơn theo chiều ngang:
$ sed 's/:/ /; /^$/d' sample.txt \
| sort | paste - - - - -
title1 A1 title1 B1 title1 C1 title1 D1 title2 A2
title2 B2 title2 C2 title2 D2 title3 A3 title3 B3
title3 C3 title3 D3 title4 A4 title4 B4 title4 C4
title4 D4 title5 A5 title5 B5 title5 C5 title5 D5
Bây giờ chúng ta chỉ cần loại bỏ các lần xuất hiện thứ cấp của title1, title2, v.v.:
$ sed 's/:/ /; /^$/d' sample.txt \
| sort | paste - - - - - | sed 's/\ttitle[0-9] / /g'
title1 A1 B1 C1 D1 A2
title2 B2 C2 D2 A3 B3
title3 C3 D3 A4 B4 C4
title4 D4 A5 B5 C5 D5
Bây giờ nó ở một định dạng transpose
có thể đối phó. Lệnh sau sẽ thực hiện toàn bộ chuyển vị:
$ sed 's/:/ /; /^$/d' sample.txt \
| sort | paste - - - - - | sed 's/\ttitle[0-9] / /g' \
| transpose -t --fsep " "
title1 title2 title3 title4
A1 B2 C3 D4
B1 C2 D3 A5
C1 D2 A4 B5
D1 A3 B4 C5
A2 B3 C4 D5