Saya memiliki file yang terlihat seperti berikut:
chr19 61336212 + 0 0 CG CGT
chr19 61336213 - 0 0 CG CGG
chr19 61336218 + 0 0 CG CGG
chr19 61336219 - 0 0 CG CGC
chr19 61336268 + 0 0 CG CGG
chr19 61336269 - 0 0 CG CGA
chr19 61336402 + 0 0 CG CGG
chr19 61336403 - 0 0 CG CGT
Saya ingin membagi file ini untuk setiap interval 10.000 bidang ke-2 (BUKAN garis, tetapi interval angka). Jadi untuk file ini saya ingin memisahkan dari baris pertama (baris dengan 61336212) ke baris yang memiliki atau hingga 61346211 (61336212 + 9999), kemudian dari 61346212 hingga 61356211, dan seterusnya dan seterusnya. Seperti yang Anda lihat angka-angka di kolom 2 / kolom tidak 'diisi'.
Apakah ada cara untuk melakukan ini?
text-processing
awk
split
agathusia
sumber
sumber
Jawaban:
Akan menulis ke
file.0000
,file.0001
... (nomor yangint(($2-n)/10000)
manan
adalah$2
untuk baris pertama).Perhatikan bahwa kami menutup file setelah kami berhenti menulis kepada mereka seperti sebaliknya, Anda akan mencapai batas jumlah file yang dibuka secara bersamaan setelah beberapa ratus file (GNU
awk
dapat mengatasi batas itu, tetapi kemudian kinerjanya menurun dengan cepat).Kami mengasumsikan angka-angka itu selalu naik.
sumber
file = ...
, tetapi bagaimana iterasi bekerja? Tidak ada bagian yang mengatakann = n + 10000
ataulower_boundary <= $2 < upper_boundary
bagian. Secara umum keseluruhanif (file != last_file) { close(last_file) ; last_file = file }
keluar dari liga sayaif (file != last_file)
: jika file saat ini tidak sama dengan file sebelumnya, tutup file sebelumnya (jadi hanya buka satu file pada satu waktu (kita tidak perlu menyimpannya) semua terbuka seperti solusi lain lakukan))Meretas versi satu-liner. Mungkin lebih cocok untuk Code Golf daripada forum ini. Ini menghasilkan split1, split2, split3 dan seterusnya, sebagai nama file.
Untuk memiliki file output bernama split001, split002, split003, melibatkan tambahan ini
sprintf
:Untuk menghindari masalah pelambatan gawk yang diidentifikasi oleh @ Stéphane Chazelas, gunakan perl:
sumber
sprintf
sihir ekstra sekarang ditambahkan.Tes dengan interval yang diatur ke 100:
Catatan: akan menghasilkan file kosong untuk interval kosong; untuk menghapus file kosong, tambahkan:
Akan melindas file untuk setiap langkah dalam
for
loop, sehingga bukan yang paling efisien.sumber
Jika yang Anda maksud hanya perhitungan bukan penghitungan baris:
sumber