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?

Kohjah Breese
sumber

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
Steeldriver
sumber
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

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

coba ini,

tail -n +43 dump.sql > dump_new.sql

ptantiku
sumber
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

Steven Penny
sumber
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.

kb2bcg
sumber
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
souravc
sumber
0

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

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

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

Akash Agarwal
sumber