Bir dosyayı belirli bir satırda iki dosyaya bölme


12

Bir dosyayı verilen bir satır numarasında iki dosyaya bölmek için unix bir yol arıyorum.

split -l 100 file_namearadığım şeye yakın, ancak bu komut her biri 100 satırdan oluşan birden fazla dosya oluşturur. Bir dosyayı verilen bir satır numarasında iki dosyaya bölmek için bir komut arıyorum. Bunu unix'te yapmanın bir yolu var mı?

Yanıtlar:


13

Biraz daha sıkı bir çözüm:

(head -100 > f1.txt; cat > f2.txt) < input.txt

1
Güzel çözüm. wcÖnceden sayım yapılmaz ve giriş dosyası awkçözümde olduğu gibi yalnızca bir kez işlenir .
Dubu

2
Çıktılacak headilk 100 satırı bulmak için sadece 100 satırdan fazla okuma şansı azdır f1.txt; bu ekstra baytlar tarafından görülmez cat.
chepner

Bu çok lanet yavaş
sdaffa23fdsf

12

awkGiriş dosyasında yalnızca bir geçiş yapmanız için kullanın . Aşağıda, ilk dosyada ilk 122 satırı, ikinci dosyada geri kalan satırı istediğinizi varsayar.

awk 'NR < 123 { print >> "top_file"; next } {print >> "bottom_file" }' file_name

Bu bir başparmak hak ediyor. bir dosyayı X'ten Y'ye bölmek istiyorsanız, bu en kolayıdır.
Glenn Plas

Bu anlaşılması en kolay çözümdür. Bir cazibe gibi çalıştı ... ve bana 1999'dan beri sahip olduğum O'Reilly Sed & Awk kitabımın tozunu fırçalamam gerektiğini düşündürüyor, sed bölümü iyi okunuyor, awk bölümü o kadar da değil.
Michael

Bu @chepner yorumlarda metioned nedeni için istisna çözüm daha iyidir. 'F2.txt' dosyasındaki karakterleri kaybedeceksiniz. Bu çözüm doğru ve verimlidir. awk ftw.
Goran

7

Her iki parçayı da almak için headve tuşlarını kullanabilirsiniz tail:

head -n K file_name > top_file
tail -n L file_name > bottom_file

burada Ksatır numarası ve Lalttan satır sayısıdır (toplam satır sayısı - K).

(kullanarak toplam satır sayısını alabilirsiniz wc -l file_name).


5

Bunu csplityapmak için (varsa) kullanabilirsiniz:

csplit file N+1

dosyayı iki parçaya böler, bir parça satır numarasına (ve dahil) Nve diğer parça satır numarasından N+1son satıra kadar.
Satır numarasına bölmek (ancak dahil etmemek) istiyorsanız N:

csplit file N

Bu harika! Teşekkürler, sorunu benim için mükemmel bir şekilde çözdü.
Zertrin

20GB dosyasını parçalara bölmek için en iyi performans.
dr0i

@ dr0i - hiç şüphe yok, csplitbu iş için optimize edildi.
don_crissti

Bir 200M-satırları dosya bölme 2008 tarihli bir csplit kullanarak "bellek tükendi" var. 2011 tarihli
csplit

4

Her ikisi de headve tail"diğer" ucundan aksi takdirde daha satır üretmek için seçenekler var. Yani şu iki seçeneğiniz var:

head -n 100 source.txt > file1.txt
head -n -100 source.txt > file2.txt

veya (NNN'nin çıktısından 100 daha az olduğu yerlerde wc -l source.txt):

tail -n +NNN source.txt > file1.txt
tail -n NNN source.txt > file.txt

Sürümleriniz headve taildaha fazla bilgi için kılavuz sayfalarını okuyabilirsiniz .


0

'Wc', 'dc', 'kafa' ve 'kuyruk' kullanabilirsiniz. yani

unix> wc -l foo
545 /tmp/foo
unix> dc -e '545 100 - p'
445
unix> head -n 100 foo > filea
unix> tail -n 445 foo > fileb

Kullanım kolaylığı için, yukarıda bir kabuk betiğine dönüştürebilirsiniz.

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.