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 split
ama çoklu parçalar oluşturuyor.
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 split
ama çoklu parçalar oluşturuyor.
Yanıtlar:
En kolay yolu kullanımına muhtemelen head
ve tail
:
$ head -n 1000 input-file > output1
$ tail -n +1001 input-file > output2
Bu, ilk 1000 satırı input-file
içine output1
ve 1001'den sonuna kadar tüm satırlarıoutput2
Bence bu split
en iyi yaklaşım.
-l xxxx
Seçeneği kullanmayı deneyin , burada xxxx her dosyada istediğiniz satır sayısıdır (varsayılan 1000'dir).
-n yy
Oluş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.
man split
man wc
split -l 1000 bigfile && mv xaa piece1 && cat x?? > piece2 && rm x??
.
Bu bir iş csplit
:
csplit -s infile 1001
olacak s
ilently bölme infile
, ilk parça xx00
- kadar ancak hattı 1001 ve ikinci parça hariç xx01
- Geriye kalan hatları. Bir önek
kullanma -f
ve belirleme gibi farklı çıktı dosyası adlarına ihtiyacınız varsa seçeneklerle oynayabilirsiniz :
csplit -sf piece. infile 1001
adlı iki dosya üretir piece.00
vepiece.01
Bir akıllı ile de şöyle bir head
şey yapabilirsiniz:
{ head -n 1000 > 1st.out; cat > 2nd.out; } < infile
csplit
. Çok hoş. (Sadece POSIX komutlarının listesini okuyorum ve başta başımın csplit
komutun amacı etrafına sarılmasında büyük bir sorun yaşadım . Gerçekten çok basit.) :)
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
split --help
mi