Chia một tập tin thành hai


18

Tôi có một tệp lớn và cần chia thành hai tệp. Giả sử trong tệp đầu tiên, 1000 dòng nên được chọn và đưa vào tệp khác và xóa các dòng đó trong tệp đầu tiên.

Tôi đã thử sử dụng splitnhưng nó đang tạo ra nhiều khối.


Bạn đã kiểm tra split --helpchưa?
Braiam

Có tôi đã kiểm tra nó, nhưng đang tạo nhiều tệp không cần cho tôi.
Aravind

Câu trả lời:


29

Cách dễ nhất có lẽ là sử dụng headtail:

$ head -n 1000 input-file > output1
$ tail -n +1001 input-file > output2

Điều đó sẽ đưa 1.000 dòng đầu tiên từ input-filevào output1, và tất cả các dòng từ 1001 đến cuối nămoutput2


12

Tôi nghĩ rằng đó splitlà cách tiếp cận tốt nhất của bạn.

Hãy thử sử dụng -l xxxxtùy chọn, trong đó xxxx là số dòng bạn muốn trong mỗi tệp (mặc định là 1000).

Bạn có thể sử dụng -n yytùy chọn nếu bạn quan tâm hơn về số lượng tệp được tạo. Sử dụng -n 2sẽ chia tệp của bạn chỉ trong 2 phần, bất kể số lượng dòng trong mỗi tệp.

Bạn có thể đếm số lượng dòng trong tệp của bạn với wc -l filename. Đây là lệnh 'wordcount' với tùy chọn dòng.

Người giới thiệu

  • man split
  • man wc

1
Đây là cách chia thành một nhóm các tệp có số dòng cố định hoặc cách chia đều thành một số tệp cố định. Có cách nào để chia thành một tệp 1000 dòng và một tệp với mọi thứ khác không? Đó là những gì anh ấy đã yêu cầu; Tôi không thể tìm thấy nó trong trang người đàn ông
Michael Mrozek

Bạn chính xác Michael. Tôi nghĩ rằng tôi đã có một cái nhìn đơn giản về câu hỏi. Bạn giải pháp là tốt nhất trong trường hợp này. Một cách khác là sử dụng lệnh 'sed': sed -n 1.1000 gốcfile> first_1000_lines. sed '1,1000d' gốcfile> còn lại_lines.
Lucien Raven

Tất nhiên bạn có thể làm split -l 1000 bigfile && mv xaa piece1 && cat x?? > piece2 && rm x??.
G-Man nói 'Phục hồi Monica'

8

Đây là một công việc cho csplit:

csplit -s infile 1001 

sẽ stách ra một cách bất hợp pháp infile, phần đầu tiên xx00- lên đến nhưng không bao gồm dòng 1001 và phần thứ hai xx01- các dòng còn lại.
Bạn có thể chơi với các tùy chọn nếu bạn cần các tên tệp đầu ra khác nhau, ví dụ như sử dụng -fvà chỉ định tiền tố :

csplit -sf piece. infile 1001 

tạo ra hai tập tin có tên piece.00piece.01


Với một thông minh, headbạn cũng có thể làm một cái gì đó như:

{ head -n 1000 > 1st.out; cat > 2nd.out; } < infile

1
Wow, nó thực sự một công việc cho csplit. Rất đẹp. (Tôi chỉ đọc qua danh sách các lệnh POSIX và lúc đầu gặp rắc rối lớn csplitvới mục đích của lệnh. Hóa ra nó thực sự rất đơn giản.) :)
Wildcard

4

Một cách đơn giản để làm những gì câu hỏi yêu cầu, trong một lệnh:

awk '{ if (NR <= 1000) print > "piece1"; else print > "piece2"; }' bigfile

hoặc, đối với những người bạn thực sự ghét phải gõ các lệnh dài, dễ hiểu bằng trực giác,

awk '{ print > ((NR <= 1000) ? "piece1" : "piece2"); }' bigfile
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.