comandos de shell bash para la secuencia de ADN [cerrado]

-4

Tengo un archivo con secuencia de ADN como en el ejemplo a continuación. ¿Cómo puedo encontrar el recuento de A, T, G, C en cada columna (sí, no fila, sino columna) usando los comandos de shell bash.

El archivo tiene 846975 filas como esta:

AAGAAAGAAGAGGAACTTCTCTCCATCCAGCCTCATTCCACTGCACCAACTCTTCTGTGT
CGGGTTGTGCAGGAGAGAAAGGGAGCTTGGCAACTCTTTGCTGTGCTGAGTTGTGGTAGC
CCATCACTGGGTTGTAAAGTGCCTTGCCTCCTTTCCTCCCCTCCTTTTTTTTTGAGACAG
AGTCTCACTCTGTCGTCCAGGCTGAGGTGCAGTGGTGCGATCTCTGCTCACTGCAACCTC
AGCCTCCTGGGTTCAAGTGATTCTCCTGCCTCAGCCTCCCAGGAAGCTGGGACTACAGGC
ACATGCCACCACACCTGGCTAACTTTTTTTTATTTTTAGTAGAGAAAGGGTATCACCATG
TTGGCCAGGCTGGTCTTGAACTCCTGACTTCAGGTGATCCACCCACCTTGGCCCCCCAAA
GTGCTGGGGTTAAAGGCATGAGACACTGCGCCCGTCCACCTCCTCTTTTACTTGGGAGAA
ATGCACAGATTCTGGGTGCCATGTGCATTTGTTTTGGGAGTGATAATTGATCTAACTTAT
GGAAATAATACTAGATAGTTAGCGGATGGATTCTGTATCTGATGAGAGTTTTGGGCAAAA
CGAATTCCTAGTTTCTGAGTCTTATTTTTCCCCTGATTCAAGAAAACTGTGAATTATCCA
GCCAGTAAAAAACTCTCACAGCTCTGGATGTGAGTTTAGGACACTGGATTTCTACCACTC
ATTTTCTTACTACTTTTCCTGTGCAAGGATCATGGCACAAGTTGCAGTTTCCACCCTGCC
CATTGAAGATGAGGAGTCTGTTGAAGATGAGGAGTCCTTGGAGAGCAGGATGGTGGTGAC
ATTCCTGTCAGCTCTCGCCTCCATGGTCAGACCTTCTGTTCTCACATTCTGTAGTTCGGT
AGGACTGGGCGGTAGATAAGGTTGATTTGTTTTCGTAGAACTTACAATTTTGTGATTTTT
AGTTCTAATGAGTAGACCTTTTTCGTGAATAGTAGTTACGATCAAACACCTCTGACCAAA

Para este ejemplo, se supone que la salida de la primera columna es A=9,T=1,G=3,C=4.

usuario254856
fuente
2
en cada columna , ¿quieres decir en cada fila ?
RomanPerekhrest
Tengo una secuencia grande con 846975 filas ... sería mejor si me sugieres un recuento de columnas A, T, G, C ...
user254856
columna sabia cuenta A, T, G, C - publique cómo debe verse el resultado esperado (al menos algunas líneas)
RomanPerekhrest
para la secuencia anterior que he enviado ... la salida supuesta debería ser como A = 9, T = 1, G = 3, C = 4
user254856
así que mi respuesta en la segunda sección por columnas responder a su pregunta, mientras que otras son respuestas por fila, por favor editar el post con el comentario como que aclaró
αғsнιη

Respuestas:

1

En el caso general donde awkadmite separador de campo nulo / vacío (esto es gawkespecífico), puede hacer algo como a continuación (cuando desee conteos por línea).

gawk -F '' '{for (x=1;x<=NF;x++) arr[NR$x]++;
    for (i in arr) printf("%s:%d\t", i, arr[i]);delete arr;print ""}' infile

NO, si realmente necesita conteos por cada columna (suponiendo un separador de archivos vacío) , primero debe transformar los datos de entrada de la columna en filas, luego haga lo mismo que anteriormente.

gawk -F '' '{for (x=1;x<=NF;x++) arr[NR$x]++;
    for (i in arr) printf("%s:%d\t", i, arr[i]);delete arr;print ""}' \
<(gawk -F '' '{for (i=1;i<=NF;i++) ctr[i]=ctr[i]$i} 
    END{for (i in ctr) print ctr[i]}' infile)

Con el siguiente awkscript estamos transponiendo las columnas en filas.

gawk -F '' '{for (i=1;i<=NF;i++) ctr[i]=ctr[i]$i} 
    END{for (i in ctr) print ctr[i]}' infile

Puede utilizar el siguiente comando en lugar del anterior para la transposición.

sed 's/./& /g' in|datamash -t ' ' transpose |sed 's/ //g'
αғsнιη
fuente
0

Supongo que querías encontrar el recuento de A, T, G, C en cada fila .

Solución GNU awk :

awk -v FPAT="[A-Z]" '{ 
           printf "A: %s, T: %s, G: %s, C: %s\n",
           gsub("A",""),gsub("T",""),gsub("G",""),gsub("C","") 
       }' file

La salida:

A: 17, T: 15, G: 9, C: 19
A: 11, T: 16, G: 24, C: 9
A: 8, T: 23, G: 10, C: 19
A: 9, T: 16, G: 16, C: 19
A: 11, T: 13, G: 16, C: 20
A: 17, T: 20, G: 10, C: 13
A: 11, T: 14, G: 13, C: 22
A: 12, T: 15, G: 17, C: 16
A: 14, T: 23, G: 15, C: 8
A: 20, T: 18, G: 17, C: 5
A: 16, T: 23, G: 8, C: 13
A: 17, T: 16, G: 12, C: 15
A: 12, T: 21, G: 10, C: 17
A: 16, T: 14, G: 24, C: 6
A: 8, T: 22, G: 11, C: 19
A: 14, T: 25, G: 16, C: 5
A: 20, T: 18, G: 10, C: 12
RomanPerekhrest
fuente
-1

Supongo que el usuario quiere contar las bases en cada fila.

Usando Perl:

$ perl -ne 'chomp; printf("%s\t%2d %2d %2d %2d\n", $_, tr/A/A/, tr/C/C/, tr/G/G/, tr/T/T/)' file
AAGAAAGAAGAGGAACTTCTCTCCATCCAGCCTCATTCCACTGCACCAACTCTTCTGTGT    17 19  9 15
CGGGTTGTGCAGGAGAGAAAGGGAGCTTGGCAACTCTTTGCTGTGCTGAGTTGTGGTAGC    11  9 24 16
CCATCACTGGGTTGTAAAGTGCCTTGCCTCCTTTCCTCCCCTCCTTTTTTTTTGAGACAG     8 19 10 23
AGTCTCACTCTGTCGTCCAGGCTGAGGTGCAGTGGTGCGATCTCTGCTCACTGCAACCTC     9 19 16 16
AGCCTCCTGGGTTCAAGTGATTCTCCTGCCTCAGCCTCCCAGGAAGCTGGGACTACAGGC    11 20 16 13
ACATGCCACCACACCTGGCTAACTTTTTTTTATTTTTAGTAGAGAAAGGGTATCACCATG    17 13 10 20
TTGGCCAGGCTGGTCTTGAACTCCTGACTTCAGGTGATCCACCCACCTTGGCCCCCCAAA    11 22 13 14
GTGCTGGGGTTAAAGGCATGAGACACTGCGCCCGTCCACCTCCTCTTTTACTTGGGAGAA    12 16 17 15
ATGCACAGATTCTGGGTGCCATGTGCATTTGTTTTGGGAGTGATAATTGATCTAACTTAT    14  8 15 23
GGAAATAATACTAGATAGTTAGCGGATGGATTCTGTATCTGATGAGAGTTTTGGGCAAAA    20  5 17 18
CGAATTCCTAGTTTCTGAGTCTTATTTTTCCCCTGATTCAAGAAAACTGTGAATTATCCA    16 13  8 23
GCCAGTAAAAAACTCTCACAGCTCTGGATGTGAGTTTAGGACACTGGATTTCTACCACTC    17 15 12 16
ATTTTCTTACTACTTTTCCTGTGCAAGGATCATGGCACAAGTTGCAGTTTCCACCCTGCC    12 17 10 21
CATTGAAGATGAGGAGTCTGTTGAAGATGAGGAGTCCTTGGAGAGCAGGATGGTGGTGAC    16  6 24 14
ATTCCTGTCAGCTCTCGCCTCCATGGTCAGACCTTCTGTTCTCACATTCTGTAGTTCGGT     8 19 11 22
AGGACTGGGCGGTAGATAAGGTTGATTTGTTTTCGTAGAACTTACAATTTTGTGATTTTT    14  5 16 25
AGTTCTAATGAGTAGACCTTTTTCGTGAATAGTAGTTACGATCAAACACCTCTGACCAAA    20 12 10 18

O

$ perl -ne 'BEGIN { print(" A  C  G  T\n") } printf("%2d %2d %2d %2d\n", tr/A/A/, tr/C/C/, tr/G/G/, tr/T/T/)' file
 A  C  G  T
17 19  9 15
11  9 24 16
 8 19 10 23
 9 19 16 16
11 20 16 13
17 13 10 20
11 22 13 14
12 16 17 15
14  8 15 23
20  5 17 18
16 13  8 23
17 15 12 16
12 17 10 21
16  6 24 14
 8 19 11 22
14  5 16 25
20 12 10 18

El troperador en Perl hace transliteración, muy similar a la trutilidad en el shell. Devuelve el número de caracteres transliterados.

Kusalananda
fuente