Hapus Pertama n Baris dari File Teks Besar


63

Saya perlu menghapus 42 baris pertama dari dump SQL 2GB.

Saya tahu saya bisa melihat baris pertama menggunakan:

head -n 44 dump.sql

Tetapi apakah ada cara untuk mengedit atau menghapusnya?

Jawaban:


91

Jika Anda hanya ingin melihat baris dari ke-43 Anda dapat menggunakan

tail -n +43 dump.sql

The +tanda penting - tanpa itu, tailakan mencetak terakhir 43 garis gantinya. Atau dengan 'sed'

sed 1,42d dump.sql

Jika Anda ingin benar-benar menghapus 42 baris pertama dari file asli maka Anda dapat membuat dan melakukan perubahan di tempat dengan -iopsi

sed -i 1,42d dump.sql

Jawaban mengagumkan, penggunaan fantastis tail. Saya menemukan berkali-kali sesuatu yang baru untuk dipelajari dari jawaban Anda. Terima kasih.
souravc

1
Oh man tail -n +43 adalah game changer! Saya telah menggunakan doa aneh untuk efek yang sama.
pfctdayelise

4
Bagaimana jika Anda tidak memiliki ruang yang tersisa di perangkat? sed -i 1,50000000d 17GigFilemembuat file temp sedXYZyang mengkonsumsi lebih banyak gigabytes. Apakah ada pendekatan tanpa file temp?
juanmf

Apa perbedaan antara tail -n +43dan head -n 44seperti yang disebutkan dalam pertanyaan?
Hashim

@ juanmf Anda mungkin mencoba melakukan ini dengan alat gui (saya sudah melakukannya menggunakan Mousepad, tetapi file yang menarik adalah "hanya" ~ 700MB. Butuh beberapa saat untuk memuat file, meskipun ...
Digger

18

Ini tampaknya yang paling mudah:

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

Hapus baris 1-42 dari test.sql dan simpan sebagai test2.sql


9
yang lebih pendek akan menjadi test.sql sed-i '1,42d' jika Anda tidak perlu menyimpan file asli.
Sadi


3

Anda dapat menggunakan Vim dalam mode Ex:

ex -s -c '1d42|x' dump.sql
  1. 1 pindah ke baris pertama

  2. 42 pilih 42 garis

  3. d menghapus

  4. x Simpan dan tutup


1
Apakah itu membuat file temp? Apakah mungkin untuk melakukan ini ketika ruang yang tersisa di perangkat kurang dari ukuran file?
juanmf

2
@ juanmf Semua solusi ini memerlukan file sementara. Hanya mungkin untuk menghapus data dari ujung file tanpa menggunakan file sementara.
PerlDuck

0

Maaf, saya tidak bisa memberikan kode aktual kepada Anda saat ini. Namun, cobalah melihat sesuatu di sepanjang garis

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

Apa yang harus dilakukan (setelah diformat dengan benar) adalah menghitung jumlah baris dalam file (wc-l), kurangi 44 dari itu (-44) dan kemudian cetak semuanya mulai dengan baris ke-45 dalam file.

Semoga ini bisa membantu dan semoga berhasil.


Ini tidak cukup optimal, memanggil wc -lfile, Anda memprosesnya dua kali, sedangkan sedatau tailmemprosesnya hanya sekali.
yo

0

Coba ini,

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

atau,

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

0

Tambahkan saja ini. Jika Anda menggunakan mac, Anda perlu menambahkan ekstensi cadangan. Jawab dari posting ini .

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

0

Karena sedperbedaan di Linux dan Mac, saya memutuskan untuk menggunakan tail -n +43 dump.sql > dump.sqlformat.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.