У меня есть файл, который выглядит следующим образом:
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
Я хочу разделить этот файл на каждые 10000 интервалов 2-го поля (НЕ строки, а интервал номера). Таким образом, для этого файла я хотел бы разбить первую строку (строку с 61336212) на строку, которая имеет или до 61346211 (61336212 + 9999), затем с 61346212 до 61356211, и так далее, и так далее. Как видите, цифры во 2-м поле / столбце не «заполнены».
Есть ли способ сделать это?
text-processing
awk
split
agathusia
источник
источник
Ответы:
Написали бы , чтобы
file.0000
,file.0001
... (число того ,int(($2-n)/10000)
гдеn
находится$2
на первой линии).Обратите внимание, что мы закрываем файлы, как только прекратим запись в них, в противном случае вы достигнете предела числа одновременно открываемых файлов после нескольких сотен файлов (GNU
awk
может обойти это ограничение, но тогда производительность быстро ухудшится).Мы предполагаем, что эти цифры всегда растут.
источник
file = ...
, но как работает итерация? Там нет части, которая говорит,n = n + 10000
ниlower_boundary <= $2 < upper_boundary
части. В целом всеif (file != last_file) { close(last_file) ; last_file = file }
вышло из моей лигиif (file != last_file)
: если текущий файл не совпадает с предыдущим файлом, закройте предыдущий файл (поэтому открывайте только один файл за раз (нам не нужно их хранить) все открыто, как и другие решения))Взломать однострочную версию. Возможно, больше подходит для Code Golf, чем этот форум, хотя. Это генерирует split1, split2, split3 и так далее, в качестве имен файлов.
Чтобы иметь выходные файлы с именами split001, split002, split003, необходимо добавить следующее
sprintf
:Чтобы избежать проблемы замедления работы gawk, выявленной @ Stéphane Chazelas, используйте perl:
источник
sprintf
магия.Тест с интервалом в 100:
Примечание: создаст пустые файлы для пустых интервалов; для удаления пустых файлов добавьте:
Будет выполняться файл для каждого шага в
for
цикле, поэтому не самый эффективный.источник
Если вы имеете в виду только расчет, а не подсчет строк:
источник