separador - Salida de línea completa una vez para cada valor único de una columna(Bash)
sed linux (4)
Solo use sort:
sort -k 2,2 -u file
El -u
elimina las entradas duplicadas (como quería), y -k 2,2
hace que el campo 2 sea el campo de clasificación (y por lo tanto ignora el resto cuando busca duplicados).
Esto seguramente debe ser una tarea trivial con awk
o no, pero me ha dejado rascándome la cabeza esta mañana. Tengo un archivo con un formato similar a este:
pep> AEYTCVAETK 2 genes ADUm.1024,ADUm.5198,ADUm.750
pep> AIQLTGK 1 genes ADUm.1999,ADUm.3560
pep> AIQLTGK 8 genes ADUm.1999,ADUm.3560
pep> KHEPPTEVDIEGR 5 genes ADUm.367
pep> VSSILEDKTT 9 genes ADUm.1192,ADUm.2731
pep> AIQLTGK 10 genes ADUm.1999,ADUm.3560
pep> VSSILEDKILSR 3 genes ADUm.2146,ADUm.5750
pep> VSSILEDKILSR 2 genes ADUm.2146,ADUm.5750
Me gustaría imprimir una línea para cada valor distinto de los péptidos en la columna 2, lo que significa que la entrada anterior se convertiría en:
pep> AEYTCVAETK 2 genes ADUm.1024,ADUm.5198,ADUm.750
pep> AIQLTGK 1 genes ADUm.1999,ADUm.3560
pep> KHEPPTEVDIEGR 5 genes ADUm.367
pep> VSSILEDKTT 9 genes ADUm.1192,ADUm.2731
pep> VSSILEDKILSR 3 genes ADUm.2146,ADUm.5750
Esto es lo que he intentado hasta ahora, pero claramente tampoco hace lo que necesito:
awk ''{print $2}'' file | sort | uniq
# Prints only the peptides...
awk ''{print $0, "/t", $1}'' file |sort | uniq -u -f 4
# Altogether omits peptides which are not unique...
Una última cosa, necesitará tratar los péptidos que son subcadenas de otros péptidos como valores distintos (por ejemplo, VSSILED y VSSILEDKILSR). Gracias :)
Una forma de usar awk
:
awk ''!array[$2]++'' file.txt
Resultados:
pep> AEYTCVAETK 2 genes ADUm.1024,ADUm.5198,ADUm.750
pep> AIQLTGK 1 genes ADUm.1999,ADUm.3560
pep> KHEPPTEVDIEGR 5 genes ADUm.367
pep> VSSILEDKTT 9 genes ADUm.1192,ADUm.2731
pep> VSSILEDKILSR 3 genes ADUm.2146,ADUm.5750
Usaría Perl para esto:
perl -nae ''print unless exists $seen{$F[1]}; undef $seen{$F[1]}'' < input.txt
El conmutador n
funciona línea por línea con la entrada, el conmutador divide la línea en la matriz @F
.
awk ''{if($2==temp){next;}else{print}temp=$2}'' your_file
probado a continuación:
> awk ''{if($2==temp){next;}else{print}temp=$2}'' temp
pep> AEYTCVAETK 2 genes ADUm.1024,ADUm.5198,ADUm.750
pep> AIQLTGK 1 genes ADUm.1999,ADUm.3560
pep> KHEPPTEVDIEGR 5 genes ADUm.367
pep> VSSILEDKTT 9 genes ADUm.1192,ADUm.2731
pep> AIQLTGK 10 genes ADUm.1999,ADUm.3560
pep> VSSILEDKILSR 3 genes ADUm.2146,ADUm.5750