Büyük Bir Metin Dosyasının İlk n Satırlarını Kaldırma


63

2GB SQL dökümü ilk 42 satırını kaldırmak gerekiyor.

İlk satırları kullanarak şunları izleyebildiğimi biliyorum:

head -n 44 dump.sql

Ancak bunları düzenlemek veya kaldırmak için yine de var mı?

Yanıtlar:


91

Sadece istiyorsanız görüntülemek kullanabilirsiniz üzerinde 43. gelen çizgileri

tail -n +43 dump.sql

+İşareti önemlidir - bu olmadan tailyazdırılır son yerine 43 satırları. Alternatif olarak 'sed' ile

sed 1,42d dump.sql

Gerçekten orijinal dosyadan ilk 42 satırları silmek istiyorsanız o zaman sed ile değişim INPLACE yapmak yapabilir -iseçeneği

sed -i 1,42d dump.sql

Müthiş cevap, fantastik kullanımı tail. Cevaplarından öğrenecek bir çok şey buldum. Teşekkürler.
souravc

1
Ah erkek kuyruk -n +43 bir oyun değiştirici! Ben de aynı etkiyi uyandıran tuhaf bir çağrı yaptım.
pfctdayelise

4
Cihazda boş yer kalmazsa ne olur? çok daha fazla gigabayt tüketen sed -i 1,50000000d 17GigFilegeçici bir dosya oluşturur sedXYZ. Temp dosyaları olmayan bir yaklaşım var mı?
juanmf

Arasındaki fark nedir tail -n +43ve head -n 44söz konusu belirtildiği gibi?
Hashim

@juanmf Bunu bir gui aracıyla yapmaya çalışabilirsiniz (Mousepad kullanarak yaptım, ancak ilgilenilen dosya "sadece" idi ~ ~ 700 MB. Dosyanın yüklenmesi biraz zaman alıyor ...
Digger

18

Bu en kolay gibi görünüyor:

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

1-42 satırlarını test.sql dosyasından çıkarın ve test2.sql olarak kaydedin


9
Orijinal dosyayı saklamanız gerekmiyorsa, daha kısa olanı sed -i '1,42d' test.sql olacaktır.
Sadi


3

Vim'i Ex modunda kullanabilirsiniz:

ex -s -c '1d42|x' dump.sql
  1. 1 ilk satıra taşı

  2. 42 42 çizgi seç

  3. d silmek

  4. x kaydet ve kapat


1
Temp dosyası oluşturuyor mu? Cihazda kalan alan dosya boyutundan küçük olduğunda bunu yapmak mümkün müdür?
juanmf

2
@juanmf Tüm bu çözümler geçici bir dosya gerektiriyor. Verileri bir dosyanın sonundan geçici bir dosya kullanmadan silmek mümkündür .
PerlDuck 14:18

0

Üzgünüm, şu anda size gerçek bir kod veremiyorum. Ancak, çizgileri boyunca bir şeye bakmayı deneyin

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

Bunun yapması gereken (bir kez doğru biçimlendirildiğinde) dosyadaki satır sayısını (wc -l) saymak, ondan 44 (-44) çıkarmak ve dosyadaki 45. satırdan başlayarak her şeyi yazdırmaktır.

Umarım bu yardımcı olur ve iyi şanslar.


Bu çağrıda, oldukça optimal değildir wc -loysa, iki kez işlemek, dosya üzerinde sedveya tailsadece bir kez işlemek.
yo'

0

Bunu dene,

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

veya,

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

0

Sadece bunu eklemek için. Bir mac kullanıyorsanız, yedekleme uzantısını eklemeniz gerekir. Bu gönderiden cevap .

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

0

sedLinux ve Mac'teki farklılıklar nedeniyle tail -n +43 dump.sql > dump.sqlformat kullanmaya karar verdim .

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.