Cách tách tệp ở một số dòng [đã đóng]


94

Tôi muốn tách một tệp nhật ký dài 400k dòng từ một số dòng cụ thể.

Đối với câu hỏi này, hãy đặt đây là một con số tùy ý 300k.

Có lệnh linux nào cho phép tôi thực hiện việc này ( trong script ) không?

Tôi biết splitcho phép tôi chia tệp thành các phần bằng nhau theo kích thước hoặc số dòng nhưng đó không phải là điều tôi muốn. Tôi muốn 300k đầu tiên trong một tệp và 100k cuối cùng trong tệp thứ hai.

Bất kỳ trợ giúp sẽ được đánh giá cao. Cảm ơn!

Theo suy nghĩ thứ hai, điều này sẽ phù hợp hơn với trang web superuser hoặc serverfault.


16
Tôi nghĩ câu hỏi này là ổn ở đây. Bạn có một nhiệm vụ lập trình mà bạn đang cố gắng giải quyết bằng một tập lệnh shell; nếu nó là một lớp lót bằng cách sử dụng các công cụ Unix có sẵn rộng rãi, thì càng tốt!
Jim Lewis

Tôi cũng nghĩ như vậy. Nhưng sau đó một lần nữa tôi không viết kịch bản shell :) ồ, dù sao cũng đã tìm thấy câu trả lời của mình. Cảm ơn
denormalizer

5
Câu hỏi này là tốt IMHO, mà không nghi ngờ gì nữa, đó là một câu hỏi lập trình và nó không phải là quá cục bộ hoặc
Peter

9
tại sao đây là một câu hỏi lạc đề? ý nghĩ cảnh sát điên rồ hơn bao giờ hết.
Karel Bílek

6
Mặc dù câu hỏi này có thể hơi lạc đề, nhưng nó được bình chọn cao và là kết quả đầu tiên trong các công cụ tìm kiếm với các truy vấn như vậy "linux split file at line". Do đó, tôi khuyên bạn nên mở lại câu hỏi này, để có thể thêm các câu trả lời có giá trị khác. Hoặc ít nhất là tạo liên kết đến câu hỏi phù hợp nhất trên SU.
Antoine Pinsard

Câu trả lời:


178
file_name=test.log

# set first K lines:
K=1000

# line count (N): 
N=$(wc -l < $file_name)

# length of the bottom file:
L=$(( $N - $K ))

# create the top of file: 
head -n $K $file_name > top_$file_name

# create bottom of file: 
tail -n $L $file_name > bottom_$file_name

Ngoài ra, theo suy nghĩ thứ hai, phần tách sẽ hoạt động trong trường hợp của bạn, vì phần chia đầu tiên lớn hơn phần thứ hai. Sự phân tách đưa số dư của đầu vào vào lần phân tách cuối cùng, vì vậy

split -l 300000 file_name

sẽ xuất ra xaavới 300k dòng và xabvới 100k dòng, cho một đầu vào với 400k dòng.


Cảm ơn. đã tìm thấy một câu hỏi được trả lời tương tự tại superuser tức là. sử dụng đuôi, v.v. Và, vâng, sự phân tách sẽ hoạt động với ví dụ của tôi, nhưng không phải lúc nào ví dụ của tôi cũng là 100K.
denormalizer

2
Nếu bạn đang cố gắng để làm điều này trên Windows và không muốn sử dụng Cygwin, dự án này cung cấp tất cả các utils cần thiết như mã nhị phân win32 bản địa - unxutils.sourceforge.net
Jonathon Hill

15
Tôi sẽ sử dụng tail -n +L file_name > bottom_filenơi đơn giản L=K+1mà không cần phải chạy wcđầu tiên
Hashbrown

2
Tôi muốn sử dụng sed -n '1,1000p' test.log > top_test.log ; sed '1,1000d' test.log > bottom_test.log. IHMO, điều này đơn giản hơn và không yêu cầu tính tổng số dòng. Ngoài ra, nó vẫn hoạt động nếu các dòng được nối vào giữa việc thực hiện mỗi lệnh.
Antoine Pinsard

Đối với một số tệp, câu trả lời này để lại một dòng, nhưng bản chỉnh sửa do Hashbrown đề xuất đã khắc phục được sự cố.
scharette
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.