Tách một tệp thành hai tệp tại một dòng nhất định


12

Tôi đang tìm cách unix để chia một tệp thành hai tệp tại một số dòng nhất định.

split -l 100 file_namegần với những gì tôi đang tìm kiếm, nhưng lệnh này tạo ra nhiều tệp, mỗi tệp 100 dòng. Tôi đang tìm kiếm một lệnh để chia một tệp thành hai tệp tại một số dòng nhất định. Có cách nào để làm điều này trong unix?

Câu trả lời:


12

Một giải pháp chặt chẽ hơn một chút:

(head -100 > f1.txt; cat > f2.txt) < input.txt

1
Giải pháp tốt đẹp. Không tính wctrước và tệp đầu vào vẫn chỉ được xử lý một lần, như với awkgiải pháp.
Dubu

2
Có một cơ hội nhỏ headsẽ đọc nhiều hơn chỉ 100 dòng để tìm 100 dòng đầu tiên xuất ra f1.txt; những byte bổ sung sẽ không được nhìn thấy bởi cat.
chepner

Điều này quá chậm
sdaffa23fdsf

12

Sử dụng awk, để bạn chỉ cần thực hiện một lần chuyển qua tệp đầu vào. Giả định sau đây bạn muốn có 122 dòng đầu tiên trong tệp đầu tiên và phần còn lại trong tệp thứ hai.

awk 'NR < 123 { print >> "top_file"; next } {print >> "bottom_file" }' file_name

Điều này xứng đáng với một ngón tay cái lên. nếu bạn muốn tách một tệp từ X thành Y, đây là cách dễ nhất.
Glenn Plas

Đây là giải pháp dễ hiểu nhất. Làm việc như một bùa mê ... và khiến tôi nghĩ rằng tôi nên phủi bụi khỏi cuốn sách O'Reilly Sed & Awk mà tôi đã có từ năm 1999 hoặc lâu hơn, phần sed được đọc rất tốt, phần awk không quá nhiều.
Michael

Điều này tốt hơn giải pháp bị loại trừ vì lý do @chepner đã đo lường trong các bình luận. Bạn sẽ mất các ký tự trong tệp 'f2.txt'. Giải pháp này là chính xác và hiệu quả. awk ftw.
Goran

7

Bạn có thể sử dụng headtailđể có được cả hai phần:

head -n K file_name > top_file
tail -n L file_name > bottom_file

trong đó Klà số dòng và Llà số dòng từ dưới lên (tổng số dòng - K).

(bạn có thể lấy tổng số dòng bằng cách sử dụng wc -l file_name).


5

Bạn có thể sử dụng csplit(nếu có) để làm điều đó:

csplit file N+1

sẽ chia tệp thành hai phần, một phần cho đến (và bao gồm) số dòng Nvà phần khác từ số dòng N+1cho đến dòng cuối cùng.
Nếu bạn muốn tách tối đa (nhưng không bao gồm) số dòng N:

csplit file N

Cái đó thật tuyệt! Cảm ơn, nó đã giải quyết vấn đề hoàn hảo cho tôi.
Zertrin

Hiệu suất tốt nhất để chia tệp 20GB thành nhiều phần.
dr0i

@ dr0i - không có gì lạ, csplitđược tối ưu hóa cho công việc này.
don_crissti

Tách một tệp 200M dòng tôi đã "cạn kiệt bộ nhớ" bằng cách sử dụng một bộ tách từ ngày 2008, sử dụng csplit ngày 2011, nó hoạt động :)
dr0i

4

Cả hai headtailcó các tùy chọn để tạo các dòng từ đầu "khác" của tệp so với cách khác. Vì vậy, bạn có hai tùy chọn sau:

head -n 100 source.txt > file1.txt
head -n -100 source.txt > file2.txt

hoặc (trong đó NNN nhỏ hơn 100 so với đầu ra của wc -l source.txt):

tail -n +NNN source.txt > file1.txt
tail -n NNN source.txt > file.txt

Bạn có thể đọc các trang hướng dẫn cho các phiên bản của bạn headtailđể biết thêm thông tin.


0

Bạn có thể sử dụng 'wc', 'dc', 'head' và 'tail'. I E

unix> wc -l foo
545 /tmp/foo
unix> dc -e '545 100 - p'
445
unix> head -n 100 foo > filea
unix> tail -n 445 foo > fileb

Để dễ sử dụng, bạn có thể biến ở trên thành tập lệnh shell.

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.