
Un archivo con el que trabajo es como
NAMES n0 n1 n2 n3 n4 n5 n6 n7
REGION chr 1 100000
404 AAAAAAGA
992 TTTTTTTA
1146 CCCCGGCC
1727 CCCCCACC
1778 GCCCCCCC
Mi resultado deseado es (observe la línea dos y cómo están los números)
file1
NAMES n0 n1 n2 n3 n4 n5 n6 n7
REGION chr 404 992
404 AAAAAAGA
992 TTTTTTTA
file2
NAMES n0 n1 n2 n3 n4 n5 n6 n7
REGION chr 1146 1778
1146 CCCCGGCC
1727 CCCCCACC
1778 GCCCCCCC
lo he probado en awk
awk 'function print_vals() {
fn="file" c;
print hdr > fn;
print "REGION chr", sn, en >> fn;
for (i in a)
print a[i] >> fn;
} NR == 1 {
hdr=$0;
c=0;
next
} NF==2 && $1 >= 1000000*c {
if (c)
print_vals();
delete a;
i=0;
c++;
sn=$1;
} NF==2 {
a[++i]=$0;
en=$1;
} END {
print print_vals();
}' file
Para los datos de muestra que funcionaron y obtengo el resultado, pero para el conjunto de datos reales no. El conjunto esta aquihttps://www.dropbox.com/s/h6ukumbj08cwk99/arg_t1.gz?dl=0 Se ve así
NAMES n1 n2 n3 n4 n5 n6 n7 n8 n9 n10 n11 n12 n13 n14 n15 n16 $
REGION chr 1 10000000
69 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA$
474 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA$
584 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA$
627 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA$
676 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA$
690 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA$
894 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA$
1104 AAAAAAAAAAAAAAAAA
con la salida - que se conmuta de alguna manera... no es la forma en que debería ser
NAMES n1 n2 n3 n4 n5 n6 n7 n8 n9 n10 n11 n12 n13 n14 n15 n16 $
REGION chr 69 999927
561321 AAAAAACAAAAAAAAACAAAAAAAAAAAAAAAAAACCCAAAACAACAAAACAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAACAAAAACCAACA$
561362 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA$
562011 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA$
562029 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA$
562162 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA$
562171
¿Alguien podría decirme cómo necesito solucionar este problema o sugerirme otra función?
Respuesta1
En awk
las matrices asociativas se recorren en un orden no determinado. Reemplace su
for (i in a)
por
n = i
for(i=1;i<=n;i++)
Para encerrar tu awk en un script bash puedes usar algo como
#!/bin/bash
for file
do awk -v file="$file" '....' "$file"
done
Asegúrese de ejecutar chmod a+rx
el archivo de secuencia de comandos. También reemplace la línea.
fn="file" c;
en tu script awk por
fn = c "_" file;
Esta línea es cómo se construye su nuevo nombre de archivo: a la variable awk file
se le da inicialmente como valor el nombre del archivo que se está procesando (la sintaxis es: awk -v variable=valor). La variable awk fn
es su nuevo nombre de archivo y es la variable c
que contiene el número, concatenada con el carácter _
y la variable de nombre de archivo.
Puede ejecutar este comando bash con varios archivos como argumentos. Son procesados por el awk uno por uno.
Resultado final:
#!/bin/bash
for file
do awk -v file="$file" 'function print_vals() {
fn = c "_" file;
print hdr > fn;
print "REGION chr", sn, en >> fn;
n = i
for(i=1;i<=n;i++)
print a[i] >> fn;
} NR == 1 {
hdr=$0;
c=0;
next
} NF==2 && $1 >= 1000000*c {
if (c)
print_vals();
delete a;
i=0;
c++;
sn=$1;
} NF==2 {
a[++i]=$0;
en=$1;
} END {
print print_vals();
}' "$file"
done