Membagi file menjadi dua

18

Saya memiliki file besar dan perlu dibagi menjadi dua file. Misalkan pada file pertama 1000 baris harus dipilih dan dimasukkan ke file lain dan hapus baris-baris itu di file pertama.

Saya mencoba menggunakan splittetapi membuat beberapa potongan.

Aravind
sumber
Apakah kamu memeriksa split --help?
Braiam
Ya saya sudah memeriksanya, tetapi sedang membuat banyak file yang tidak perlu bagi saya.
Aravind

Jawaban:

30

Cara termudah adalah menggunakan headdan tail:

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

Itu akan menempatkan 1000 baris pertama dari input-fileke output1, dan semua baris dari 1001 sampai akhiroutput2

Michael Mrozek
sumber
13

Saya pikir itu splitadalah pendekatan terbaik Anda.

Coba gunakan -l xxxxopsi, di mana xxxx adalah jumlah baris yang Anda inginkan di setiap file (defaultnya adalah 1000).

Anda dapat menggunakan -n yyopsi ini jika Anda lebih mementingkan jumlah file yang dibuat. Penggunaan -n 2akan membagi file Anda menjadi hanya 2 bagian, tidak peduli jumlah baris dalam setiap file.

Anda dapat menghitung jumlah baris dalam file Anda dengan wc -l filename. Ini adalah perintah 'wordcount' dengan opsi baris.

Referensi

  • man split
  • man wc
Lucien Raven
sumber
1
Ini adalah cara membagi menjadi banyak file dengan jumlah baris tetap, atau bagaimana membagi secara merata menjadi jumlah file tetap. Apakah ada cara untuk membagi menjadi satu file 1000-line dan satu file dengan yang lainnya? Itu yang dia minta; Saya tidak dapat menemukannya di halaman manual
Michael Mrozek
Anda benar Michael. Saya pikir saya mengambil pandangan sederhana tentang pertanyaan itu. Solusi Anda adalah yang terbaik dalam hal ini. Cara lain adalah dengan menggunakan perintah 'sed': sed -n 1,1000 originalfile> first_1000_lines. sed '1,1000d' file asli> tersisa_baris.
Lucien Raven
Tentu saja bisa split -l 1000 bigfile && mv xaa piece1 && cat x?? > piece2 && rm x??.
G-Man Mengatakan 'Reinstate Monica'
8

Ini adalah pekerjaan untuk csplit:

csplit -s infile 1001 

akan sdibagi infile, bagian pertama xx00- hingga tetapi tidak termasuk baris 1001 dan bagian kedua xx01- baris yang tersisa.
Anda dapat bermain dengan opsi jika Anda memerlukan nama file output yang berbeda misalnya menggunakan -fdan menentukan awalan :

csplit -sf piece. infile 1001 

menghasilkan dua file bernama piece.00danpiece.01


Dengan cerdas headAnda juga bisa melakukan sesuatu seperti:

{ head -n 1000 > 1st.out; cat > 2nd.out; } < infile
don_crissti
sumber
1
Wow, itu benar-benar adalah pekerjaan untuk csplit. Sangat bagus. (Saya hanya membaca daftar perintah POSIX dan mengalami kesulitan besar membungkus kepala saya di sekitar tujuan csplitperintah pada awalnya. Ternyata itu benar-benar sangat sederhana.) :)
Wildcard
4

Cara sederhana untuk melakukan apa yang diminta pertanyaan, dalam satu perintah:

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

atau, bagi Anda yang benar-benar benci mengetik perintah yang panjang dan intuitif,

awk '{ print > ((NR <= 1000) ? "piece1" : "piece2"); }' bigfile
G-Man Mengatakan 'Reinstate Monica'
sumber