Xóa n dòng đầu tiên của tệp văn bản lớn


63

Tôi cần xóa 42 dòng đầu tiên của kết xuất SQL 2GB.

Tôi biết tôi có thể xem các dòng đầu tiên bằng cách sử dụng:

head -n 44 dump.sql

Nhưng có cách nào để chỉnh sửa hoặc loại bỏ chúng?

Câu trả lời:


91

Nếu bạn muốn chỉ xem các dòng từ thứ 43 trở đi, bạn có thể sử dụng

tail -n +43 dump.sql

Các +dấu hiệu rất quan trọng - không có nó, tailsẽ in cuối cùng 43 dòng để thay thế. Hoặc với 'sed'

sed 1,42d dump.sql

Nếu bạn thực sự muốn xóa 42 dòng đầu tiên khỏi tệp gốc thì bạn có thể thực hiện sed thực hiện thay đổi tại chỗ với -itùy chọn

sed -i 1,42d dump.sql

Câu trả lời tuyệt vời, sử dụng tuyệt vời tail. Tôi đã tìm thấy nhiều lần một cái gì đó mới để học hỏi từ câu trả lời của bạn. cảm ơn.
souravc

1
Oh man tail -n +43 là một người thay đổi trò chơi! Tôi đã sử dụng một lời mời lúng túng của sed để có hiệu quả tương tự.
pfctdayelise

4
Nếu bạn không còn chỗ trống trên thiết bị thì sao? sed -i 1,50000000d 17GigFiletạo một tệp tạm thời sedXYZtiêu thụ nhiều gigabyte hơn. Có một cách tiếp cận mà không có tập tin tạm thời?
juanmf

Sự khác biệt giữa tail -n +43head -n 44như được đề cập trong câu hỏi là gì?
Hashim

@juanmf Bạn có thể thử làm điều này với một công cụ gui (Tôi đã thực hiện bằng Mousepad, nhưng tệp quan tâm là "chỉ" ~ 700 MB. Mất một lúc để tải tệp, mặc dù ...
Digger

18

Đây có vẻ là dễ nhất:

sed '1,42d' test.sql > test2.sql

Xóa các dòng 1-42 khỏi test.sql và lưu dưới dạng test2.sql


9
một cái ngắn hơn sẽ là sed -i '1,42d' test.sql nếu bạn không cần giữ tệp gốc.
Sadi


3

Bạn có thể sử dụng Vim trong chế độ Ex:

ex -s -c '1d42|x' dump.sql
  1. 1 di chuyển đến dòng đầu tiên

  2. 42 chọn 42 dòng

  3. d xóa bỏ

  4. x lưu và đóng


1
Nó có tạo ra một tập tin tạm thời không? Có thể làm điều này khi không gian còn lại trên thiết bị nhỏ hơn kích thước tệp?
juanmf

2
@juanmf Tất cả các giải pháp này yêu cầu một tệp tạm thời. Chỉ có thể xóa dữ liệu từ cuối tệp mà không sử dụng tệp tạm thời.
PerlDuck

0

Xin lỗi, tôi không thể cung cấp cho bạn mã thực tế ngay bây giờ. Tuy nhiên, hãy thử nhìn vào một cái gì đó dọc theo dòng

tail -n arcv(`wc -l`) -44

Điều này nên làm (một khi được định dạng chính xác) là đếm số dòng trong tệp (wc -l), trừ 44 từ nó (-44) và sau đó in ra mọi thứ bắt đầu bằng dòng thứ 45 trong tệp.

Hy vọng điều này sẽ giúp và may mắn.


Điều này không hoàn toàn tối ưu, gọi wc -lvào tệp, bạn xử lý nó hai lần, trong khi sedhoặc tailxử lý nó chỉ một lần.
yo '

0

Thử đi,

head -n 42 dump.sql > tmp; cat dump.sql | grep -vxf tmp > dump.sql.new; rm tmp

hoặc là,

a=$(cat dump.sql| wc -l); tail -n "$((a-42))" dump.sql > dump.sql.new

0

Chỉ cần thêm điều này. Nếu bạn đang sử dụng máy Mac, bạn cần thêm tiện ích mở rộng sao lưu. Trả lời từ bài này .

sed -i '.bak' 1,42d dump.sql

0

Do sedsự khác biệt giữa Linux và Mac, tôi đã quyết tail -n +43 dump.sql > dump.sqlđịnh sử dụng định dạng.

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.