Bir dosyayı ikiye böl


18

Büyük bir dosyam var ve iki dosyaya bölmem gerekiyor. İlk dosyada 1000 satırın seçilmesi ve başka bir dosyaya konulması ve ilk dosyadaki bu satırların silinmesi gerektiğini varsayalım.

Kullanmayı denedim splitama çoklu parçalar oluşturuyor.


Kontrol ettin split --helpmi
Braiam

Evet kontrol ettim, ama bana ihtiyacı olmayan birden fazla dosya oluşturuyor.
Aravind

Yanıtlar:


31

En kolay yolu kullanımına muhtemelen headve tail:

$ head -n 1000 input-file > output1
$ tail -n +1001 input-file > output2

Bu, ilk 1000 satırı input-fileiçine output1ve 1001'den sonuna kadar tüm satırlarıoutput2


13

Bence bu spliten iyi yaklaşım.

-l xxxxSeçeneği kullanmayı deneyin , burada xxxx her dosyada istediğiniz satır sayısıdır (varsayılan 1000'dir).

-n yyOluşturulan dosya miktarı konusunda daha fazla endişe duyuyorsanız bu seçeneği kullanabilirsiniz . Kullanım -n 2, her dosyadaki satır sayısı ne olursa olsun, dosyanızı yalnızca 2 parçaya böler.

İle dosyanızdaki satır sayısını sayabilirsiniz wc -l filename. Bu, çizgiler seçeneğiyle birlikte 'wordcount' komutudur.

Referanslar

  • man split
  • man wc

1
Bu, sabit sayıda satır içeren bir grup dosyaya nasıl bölünür veya sabit sayıda dosyaya eşit olarak nasıl bölünür. 1000 satırlık bir dosyaya ve diğer her şeyi içeren bir dosyaya bölünmenin bir yolu var mı? İstediği buydu; Adam sayfasında bulamadım
Michael Mrozek

Haklısın Michael. Sanırım soruya basit bir bakış attım. Bu durumda çözümünüz en iyisidir. Başka bir yol da 'sed' komutunu kullanmak olabilir: sed -n 1,1000 originalfile> first_1000_lines. sed '1,1000d' orijinal dosya> diğer_ satırlar.
Lucien Raven

Elbette yapabilirsin split -l 1000 bigfile && mv xaa piece1 && cat x?? > piece2 && rm x??.
G-Man,

8

Bu bir iş csplit:

csplit -s infile 1001 

olacak silently bölme infile, ilk parça xx00- kadar ancak hattı 1001 ve ikinci parça hariç xx01- Geriye kalan hatları. Bir önek
kullanma -fve belirleme gibi farklı çıktı dosyası adlarına ihtiyacınız varsa seçeneklerle oynayabilirsiniz :

csplit -sf piece. infile 1001 

adlı iki dosya üretir piece.00vepiece.01


Bir akıllı ile de şöyle bir headşey yapabilirsiniz:

{ head -n 1000 > 1st.out; cat > 2nd.out; } < infile

1
Vay, gerçekten olduğu için bir iş csplit. Çok hoş. (Sadece POSIX komutlarının listesini okuyorum ve başta başımın csplitkomutun amacı etrafına sarılmasında büyük bir sorun yaşadım . Gerçekten çok basit.) :)
Wildcard

4

Sorunun istediğini tek bir komutla yapmanın basit bir yolu:

awk '{ if (NR <= 1000) print > "piece1"; else print > "piece2"; }' bigfile

veya uzun, sezgisel olarak anlaşılır komutlar yazmaktan gerçekten nefret edenler için,

awk '{ print > ((NR <= 1000) ? "piece1" : "piece2"); }' bigfile
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.