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:]]
.