proyectos ejemplos python perl bash awk bioinformatics

python - ejemplos - django



Eliminando lĂ­neas con valores repetitivos en Ășltimo (7)

Tengo un archivo delimitado por tabuladores que se parece a esto

chr1 12226559 12227059 TNFRSF1B chr1 17051560 17052060 chr1 17053279 17053779 chr1 17338423 17338923 ATP13A2 ATP13A2 ATP13A2 chr1 19577574 19578074 EMC1 MRTO4 chr1 19578046 19578546 EMC1 MRTO4 chr1 19638239 19638739 AKR7A2 PQLC2 PQLC2 PQLC2 AKR7A2 PQLC2

Quiero que las líneas donde se repite el valor de column4 se eliminen.

Las primeras tres columnas son coordenadas y en esas coordenadas lo que encontramos está en la lista (en col4), y para cada coordenada quiero tener solo nombres únicos y no la repetición de nombres.

Quiero un resultado como este

chr1 12226559 12227059 TNFRSF1B chr1 17051560 17052060 chr1 17053279 17053779 chr1 17338423 17338923 ATP13A2 chr1 19577574 19578074 EMC1 MRTO4 chr1 19578046 19578546 EMC1 MRTO4 chr1 19638239 19638739 AKR7A2 PQLC2

Cosas que he probado

sort -k 4 -u file awk ''{if($4==temp1){next;}else{print}temp1=$4}'' file

Nada funciona :(

Por favor ayuda

Gracias


Solo necesitas

awk ''$NF != prev {print} {prev=$NF}''

EDITAR: para manejar la nueva entrada

awk ''{ if (NF == 1) value = $1 else { key = $1 SUBSEP $2 SUBSEP $3 value = $4 } if ((key SUBSEP value) in val) next print val[key, value] = 1 }'' input


script simple awk

awk -F''/t'' ''{OFS="/t"; if ($4=="" || $4!=old) print; old=$4}'' input.txt

resultado

chr1 12226559 12227059 TNFRSF1B chr1 17051560 17052060 chr1 17053279 17053779 chr1 17338423 17338923 ATP13A2 chr1 19577574 19578074 EMC1 MRTO4 chr1 19578046 19578546 EMC1 MRTO4 chr1 19638239 19638739 AKR7A2 PQLC2

limpieza

Para preparar mi archivo input.txt , copié el texto de la pregunta. Pero tuve que reemplazar espacios por pestañas. Por lo tanto, utilicé un comando sed . También noté algunos espacios al final (al final de la línea). Finalmente, utilicé el siguiente comando sed para limpiar el archivo imput:

sed ''s/ *$//;/^[^ ]/s/ *//t/g;/^ /s/ *//t/t/t/g;'' copy-fron-so.txt > input.txt

archivo de entrada del comentario @dogbane

chr1 12226559 12227059 TNFRSF1B chr1 17051560 17052060 chr1 17053279 17053779 chr1 17338423 17338923 ATP13A2 ATP13A2 ATP13A2 chr1 19577574 19578074 EMC1 MRTO4 chr1 19578046 19578546 EMC1 MRTO4 chr1 19638239 19638739 AKR7A2 PQLC2 PQLC2 PQLC2 AKR7A2

(la última línea ha sido añadida)

limpieza y procesamiento

$> sed ''s/ *$//;/^[^ ]/s/ *//t/g;/^ /s/ *//t/t/t/g;'' copypaste.txt > input.txt $> awk -F''/t'' ''{OFS="/t"; if ($4=="" || $4!=old) print; old=$4}'' input.txt chr1 12226559 12227059 TNFRSF1B chr1 17051560 17052060 chr1 17053279 17053779 chr1 17338423 17338923 ATP13A2 chr1 19577574 19578074 EMC1 MRTO4 chr1 19578046 19578546 EMC1 MRTO4 chr1 19638239 19638739 AKR7A2 PQLC2 AKR7A2

requisitos cambian

La última línea que tiene AKR7A2 no se debe imprimir. Por lo tanto, primero debemos ordenar el archivo input.txt . Tenga cuidado con la opción -t para introducir una pestaña, en bash o vi presione [CTRL-V] , luego [TAB] (ponga comillas alrededor de esta pestaña).

$> LANG=C sort -k 4 -s -t '' '' input.txt > sorted.txt $> awk -F''/t'' ''{OFS="/t"; if ($4=="" || $4!=old) print; old=$4}'' sorted.txt chr1 17051560 17052060 chr1 17053279 17053779 chr1 19638239 19638739 AKR7A2 chr1 17338423 17338923 ATP13A2 chr1 19577574 19578074 EMC1 MRTO4 PQLC2 chr1 12226559 12227059 TNFRSF1B

¡Tenga en cuenta que ahora hay una sola línea que termina con MRTO4 !


Quizás lo siguiente ayude:

use strict; use warnings; my %seen; while (<DATA>) { my ($col3) = (split)[-1]; print if !$seen{$col3}++ or !$col3; } __DATA__ chr1 12226559 12227059 TNFRSF1B chr1 17051560 17052060 chr1 17053279 17053779 chr1 17338423 17338923 ATP13A2 ATP13A2 ATP13A2 chr1 19577574 19578074 EMC1 MRTO4 chr1 19578046 19578546 EMC1 MRTO4 chr1 19638239 19638739 AKR7A2 PQLC2 PQLC2 PQLC2

Salida:

chr1 12226559 12227059 TNFRSF1B chr1 17051560 17052060 chr1 17053279 17053779 chr1 17338423 17338923 ATP13A2 chr1 19577574 19578074 EMC1 MRTO4 chr1 19638239 19638739 AKR7A2 PQLC2

Esta salida también se puede lograr con el siguiente one-liner:

perl -ane "print if !$X{$F[-1]}++ or !$F[-1]" data.txt


Si las líneas repetidas están duplicadas en todas las columnas y no solo en la cuarta, uniq (1) probablemente sea adecuado. Intenta ejecutar solo un uniq file y mira si el resultado es el que esperas.


Dada la entrada recientemente publicada que usaría:

gawk -F''/t'' ''!/^/t/{delete a} !a[$4]++'' file

Utilizo gawk para poder borrar todo el array al mismo tiempo, con otras awks menos claras:

awk -F''/t'' ''!/^/t/{split("",a)} !a[$4]++'' file


Usando una pequeña secuencia de comandos de perl :

perl -e ''my $col4 = ""; while (<>) { chomp; my @f = split(//t/, $_); if ($f[3] eq "" || $f[3] ne $col4) { print $_, "/n"; } $col4 = $f[3]; }'' input.txt

resultado:

chr1 12226559 12227059 TNFRSF1B chr1 17051560 17052060 chr1 17053279 17053779 chr1 17338423 17338923 ATP13A2 chr1 19577574 19578074 EMC1 MRTO4 chr1 19578046 19578546 EMC1 MRTO4 chr1 19638239 19638739 AKR7A2 PQLC2


sed ''1{x;d};H;x;s//([ ][^/n ]*/)[ ]*/n[ ]*/1[ ]*/n//1/n/;$p;x;d;$p;x;d'' FILE

Si tiene pestañas en su archivo, aparte de espacios, puede reemplazar todo [ ] por [[:space:]] .