Làm thế nào để chuyển đổi từ hàng sang cột?


10

Tôi có một tệp .txt với các số được đặt hàng như thế này (trên cùng một hàng):

106849_01373    106849_01967    106850_00082    23025.7_01059   

Tôi muốn chuyển đổi chúng như thế:

106849_01373
106849_01967
106850_00082
23025.7_01059

Tôi không biết nên sử dụng lệnh nào. Ai đó có thể giúp tôi với điều này?

Câu trả lời:


4

Đây là một với xargs

xargs -n1 < file.txt

Bản giới thiệu:

$ cat file.txt                    
106849_01373    106849_01967    106850_00082    23025.7_01059 

$ xargs -n1 < file.txt
106849_01373
106849_01967
106850_00082
23025.7_01059

1
xargs là một công cụ tuyệt vời và nếu bạn đã không đề cập đến nó, tôi sẽ có, nhưng nó có một nhược điểm là nếu bạn bỏ qua lệnh thì nó sẽ thay thế echo (không giống như trong một số shell, xargs không có tiếng vang dựng sẵn) và -n1 yêu cầu xargs gọi lệnh cho mọi đối số, vì vậy với ví dụ này, bạn sẽ có tối thiểu sáu quy trình liên quan (shell để thực hiện chuyển hướng io, xargs và bốn echos). Điều này không quá tệ ở phạm vi này, nhưng nó chậm hơn đáng kể ở đầu ra vài nghìn dòng.
hildred 22/03/2016

15

Khá dễ dàng với tr:

tr -s '[:blank:]' '\n' <file.txt

Thí dụ:

% cat file.txt                    
106849_01373    106849_01967    106850_00082    23025.7_01059   
106849_01373    106849_01967    106850_00082    23025.7_01059   
106849_01373    106849_01967    106850_00082    23025.7_01059   
106849_01373    106849_01967    106850_00082    23025.7_01059   

% tr -s '[:blank:]' '\n' <file.txt
106849_01373
106849_01967
106850_00082
23025.7_01059
106849_01373
106849_01967
106850_00082
23025.7_01059
106849_01373
106849_01967
106850_00082
23025.7_01059
106849_01373
106849_01967
106850_00082
23025.7_01059

2

Câu trả lời của heemayl là cách để đi, tuy nhiên đây là một cách thay thế bằng cách sử dụng Perl:

perl -lane '$,="\n"; print(@F)' file.txt
  • -l: cho phép xử lý kết thúc dòng tự động. Nó có hai hiệu ứng riêng biệt. Đầu tiên, nó tự động nhai $ / (dấu tách bản ghi đầu vào) khi được sử dụng với -n hoặc -p. Thứ hai, nó gán $ \ (dấu tách bản ghi đầu ra) có giá trị octnum để bất kỳ câu lệnh in nào sẽ có dấu phân cách đó được thêm lại. Nếu octnum bị bỏ qua, đặt $ \ thành giá trị hiện tại là $ /.
  • -a: bật chế độ tự động nhận khi được sử dụng với -n hoặc -p. Lệnh chia ngầm định cho mảng @F được thực hiện như là điều đầu tiên bên trong vòng lặp ngầm định được tạo bởi -n hoặc -p.
  • -n: khiến Perl giả định vòng lặp sau xung quanh chương trình của bạn, điều này khiến nó lặp đi lặp lại qua các đối số tên tệp có phần giống như sed -n hoặc awk:

    LINE:
      while (<>) {
          ...             # your program goes here
      }
  • -e: có thể được sử dụng để nhập một dòng chương trình;

  • $,="\n": đặt dấu tách trường đầu ra thành một dòng mới;
  • print(@F): in các trường được phân tách bằng dấu tách trường đầu ra.
% cat file.txt
106849_01373    106849_01967    106850_00082    23025.7_01059 
% perl -lane '$,="\n"; print(@F)' file.txt
106849_01373
106849_01967
106850_00082
23025.7_01059

1

AWKtiếp cận. Về cơ bản thay đổi dấu tách đầu ra cho các trường và lặp. Tệp kiểm tra là ví dụ của bạn được dán lặp đi lặp lại với ENDLINE ở cuối

$ awk 'BEGIN{OFS="\n"}{for(i=1;i<=NF;i++) print $i}' some_data 
106849_01373
106849_01967
106850_00082
23025.7_01059
ENDLINE
106849_01373
106849_01967
106850_00082
23025.7_01059
ENDLINE
106849_01373
106849_01967
106850_00082
23025.7_01059
ENDLINE

1

Sử dụng sed:

sed -e 's/\s\{1,\}$//' -e 's/\s\+/\n/g' file.txt > split_file.txt

Không hoàn toàn..tôi sẽ thêm một dòng mới sau mỗi dòng (ban đầu) ..
heemayl

Kiểm tra với nhiều dòng, bạn sẽ nhận được một trường hợp rõ ràng sau đó ..
heemayl

Bạn có thể thêm một ví dụ với câu trả lời của bạn không ..
heemayl

@heemayl Bạn có nghĩa là nó sẽ biến không gian dấu thành dòng mới. Cú pháp của bạn không làm cho nó dễ hiểu. : /
techraf

1

Tôi chỉ thêm một giải pháp Python cho vui:

python3 -c 'import sys; f=open(sys.argv[1]); print(*f.read().split(),sep="\n")' mytestfile

Lệnh này chạy tập lệnh Python 3 một dòng trong 'dấu ngoặc đơn' với tên tệp bạn muốn chuyển đổi làm đối số cuối cùng. Cú pháp như thế này:

python3 -c 'PYTHON_COMMAND_OR_1-LINE-SCRIPT' ARGUMENTS

Tập lệnh 1 dòng chúng tôi sử dụng là tập lệnh này (được mở rộng thành nhiều dòng cho rõ ràng):

import sys
f=open(sys.argv[1])
print(*f.read().split(),sep="\n")

Nó nhập sysmô-đun để đọc các đối số dòng lệnh, lấy đối số đã cho đầu tiên làm tên tệp để mở và in từng đoạn dữ liệu được phân tách bằng khoảng trắng từ tệp trong một dòng.

$ cat mytestfile 
106849_01373    106849_01967    106850_00082    23025.7_01059   
106849_01373    106849_01967    106850_00082    23025.7_01059   
106849_01373    106849_01967    106850_00082    23025.7_01059   
106849_01373    106849_01967    106850_00082    23025.7_01059   

$ python3 -c 'import sys; f=open(sys.argv[1]); print(*f.read().split(),sep="\n")' mytestfile
106849_01373
106849_01967
106850_00082
23025.7_01059
106849_01373
106849_01967
106850_00082
23025.7_01059
106849_01373
106849_01967
106850_00082
23025.7_01059
106849_01373
106849_01967
106850_00082
23025.7_01059
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.