Tengo un archivo que se parece a lo siguiente:
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
Quiero dividir este archivo por cada intervalo de 10000 del segundo campo (NO líneas, sino intervalo de números). Entonces, para este archivo, me gustaría dividir desde la primera línea (la línea con 61336212) a la línea que tiene o hasta 61346211 (61336212 + 9999), luego de 61346212 a 61356211, y así sucesivamente. Como puede ver, los números en el segundo campo / columna no están 'llenos'.
¿Hay alguna forma de hacer esto?
text-processing
awk
split
agathusia
fuente
fuente
Respuestas:
Escribiría a
file.0000
,file.0001
... (el número que se estáint(($2-n)/10000)
donden
está$2
para la primera línea).Tenga en cuenta que cerramos los archivos una vez que dejamos de escribirles, de lo contrario, alcanzaría el límite en el número de archivos abiertos simultáneamente después de unos cientos de archivos (GNU
awk
puede evitar ese límite, pero luego el rendimiento se degrada rápidamente).Asumimos que esos números siempre están subiendo.
fuente
file = ...
, pero ¿cómo funciona la iteración? No hay parte que digan = n + 10000
ni unalower_boundary <= $2 < upper_boundary
parte. En general, todoif (file != last_file) { close(last_file) ; last_file = file }
está fuera de miif (file != last_file)
: si el archivo actual no es el mismo que el archivo anterior, cierre el archivo anterior (así que tenga solo un archivo abierto a la vez (no necesitamos mantenerlos) todo abierto como lo hacen otras soluciones))Hackear la versión de una sola línea. Sin embargo, quizás sea más adecuado para Code Golf que este foro. Esto genera split1, split2, split3, etc., como nombres de archivo.
Tener archivos de salida llamados split001, split002, split003, implica este extra
sprintf
:Para evitar el problema de desaceleración de gawk identificado por @ Stéphane Chazelas, use perl:
fuente
sprintf
ahora se agrega magia extra .Prueba con intervalo establecido en 100:
Nota: producirá archivos vacíos para intervalos vacíos; para eliminar archivos vacíos, agregue:
Se ejecutará sobre el archivo para cada paso en el
for
bucle, por lo tanto, no es el más eficiente.fuente
Si quiere decir solo cálculo, no recuento de líneas:
fuente