Tengo un archivo de entrada ( input.txt ) como a continuación.
id1 id2 name weight
53723848 12651711 timburnes 1.36667
53530214 12651711 timburnes 1.51191
53723848 53530214 timburnes 1.94
764157 52986038 ericcartman 0.861145
56797854 764157 ericcartman 1.35258
56797854 52986038 ericcartman 1.73781
Tenga en cuenta que la primera línea no es parte del archivo real, la he agregado aquí para mayor claridad .
Estoy tratando de extraer los valores de id1
y id2
para 2 archivos separados llamados unique.txt y duplicate.txt .
Si el weight
valor de mi columna es mayor que 1.5, significa que tengo identificadores duplicados . En este caso, moveré el id1
valor al unique.txt
archivo y el id2
valor al duplicate.txt
archivo.
Si mi columna de peso es menor a 1.5, significa que no tengo valores duplicados. Entonces, en este caso, moveré ambos id1
y id2
al archivo unique.txt .
Entonces, para la entrada anterior, espero la salida como,
Para el archivo unique.txt ,
53723848 timburnes
764157 ericcartman
56797854 ericcartman
Para el archivo duplicate.txt ,
12651711 timburnes
53530214 timburnes
52986038 ericcartman
Puedo encontrar los duplicados usando el siguiente código.
Para obtener los valores mayores que 1.5 basados en la cuarta columna,
awk -F" " '$4 >= 1.5 { print $1" " $2" " $3" " $4}' file1.txt > Output.txt
Ahora, para valores superiores a 1.5, puedo usar el siguiente código para fusionar los identificadores duplicados en función de sus nombres.
perl -ane 'foreach(@F[0..1]){$k{$F[2]}{$_}++}
END{
foreach $v (sort keys(%k)){
print "$_ " foreach(keys(%{$k{$v}}));
print "$v\n"
};
} ' Output.txt
Sin embargo, no puedo obtener la salida de la manera que me gusta en el enfoque anterior.
EDITAR :
Estoy ejecutando el comando para mi entrada como se muestra a continuación.
awk '{
if ($4 > 1.5) {
if (++dup[$2] == 1) print $2, $3 > "duplicate.txt"
}
else
if (++uniq[$1] == 1) print $1, $3 > "unique.txt"
}' << END
17412193 43979400 ericcartman 2.16667
21757330 54678379 andrewruss 0.55264
END
Estoy obteniendo la salida como,
-bash-3.2$ cat unique.txt
21757330 a.andreev
-bash-3.2$ cat duplicate.txt
43979400 ericcartman
Sin embargo, el resultado que espero es,
cat unique.txt
17412193 ericcartman
21757330 andrewruss
54678379 andrewruss
cat duplicate.txt
43979400 ericcartman
$4
menos que1.5
?$4
es menor que 1.5, los agregaré alunique.txt
archivo. Además, antes de insertar algo que seaunique.txt
oduplicate.txt
archivo, voy a tener que comprobar si el valor ya está presente en el archivo. Si ya está presente, no necesito insertarlo nuevamente.$1
y$2
cuándo$4
es inferior a 1,5?unique.txt
archivo. Por lo tanto, supongo que si$4
es inferior a 1,5, voy a añadir$1
y$2
aunique.txt
presentar.Respuestas:
Aquí hay
awk
solución:Con tu segundo ejemplo:
fuente
print i,uniq[i]
porprint i,uniq[i] >> "unique.txt"
. Haz lo mismo con dup. Una nota de que la salida no está ordenada.fuente
Aquí hay uno de Perl:
No estoy buscando duplicados aquí, si entiendo su pregunta correctamente, ya lo ha hecho y si algo es un engaño o no depende del valor del último campo. Si no estoy entendiendo algo, hágamelo saber y lo actualizaré.
El código anterior produce
fuente
1) if $4 < 1.5, then write both entry ($1 $3) and ($2 $3) to unique.txt
---2) if $4 >= 1.5, then write ($1 $3) to unique.txt and write ($2 $3) to duplicate.txt, if $2 was in unique.txt, remove its entry in unique.txt
.MERS
virus?