2010-04-08 33 views
13

Buscando un awk (o sed) de una línea para eliminar las líneas de la salida si el primer campo es un duplicado.Eliminar línea si el campo está duplicado

Un ejemplo para la eliminación de líneas duplicadas que he visto es:

awk 'a !~ $0; {a=$0}' 

intentado utilizar para una base sin suerte (pensé cambiando los $ 0 de $ 1 de que hacer el truco, pero no pareció funcionar).

+0

Se pedirá que se quite las líneas 'si los primeros partidos de campo' ... ¿qué? He asumido 'el mismo valor que el primer campo en alguna línea de entrada anterior'; otra persona asumió 'algún patrón particular'. ¿Qué pretendías? –

+0

Su versión modificada 'awk 'a! ~ $ 1; {a = $ 1} '' * funciona para mí * para duplicados adyacentes (por ejemplo, un archivo ordenado). ** La versión ** de Jonathan Leffler tiene la ventaja de que funcionará para eliminar duplicados en un archivo sin clasificar, pero a costa de crear una matriz potencialmente grande. –

+0

Creo que mi problema principal era que estaba tratando con diferentes tipos de separadores de campo y no estaba definiendo FS correctamente – Kyle

Respuesta

25
awk '{ if (a[$1]++ == 0) print $0; }' "[email protected]" 

Este es un uso estándar (muy simple) para matrices asociativas.

+0

¡Eso funcionó! Tuve otro error del que tampoco me había dado cuenta y que también podría haberme causado problemas. ¡Gracias! – Kyle

8

esto es cómo eliminar duplicados

awk '!_[$1]++' file 
+2

Usar '_' como nombre de la matriz invita a malentendidos, pero funciona. –

1

Si usted está abierto a la utilización de Perl:

perl -ane 'print if ! $a{$F[0]}++' file 

-a autosplits la línea en la matriz @F, que se indexa a partir de 0
El hash %a recuerda si el primer campo ya se ha visto


Esta solución relacionada asume el separador de campo es una coma, en lugar de espacios en blanco

perl -F, -ane 'print if ! $a{$F[0]}++' file 
Cuestiones relacionadas