2012-02-21 32 views
119

Quiero eliminar las entradas duplicadas de un archivo de texto, por ejemplo:Eliminar entradas duplicadas usando un script Bash

kavitha= Tue Feb 20 14:00 19 IST 2012 (duplicate entry) 
sree=Tue Jan 20 14:05 19 IST 2012 
divya = Tue Jan 20 14:20 19 IST 2012 
anusha=Tue Jan 20 14:45 19 IST 2012 
kavitha= Tue Feb 20 14:00 19 IST 2012 (duplicate entry) 

¿Hay alguna forma posible eliminar las entradas duplicadas utilizando un script Bash?

salida deseada

kavitha= Tue Feb 20 14:00 19 IST 2012 
sree=Tue Jan 20 14:05 19 IST 2012 
divya = Tue Jan 20 14:20 19 IST 2012 
anusha=Tue Jan 20 14:45 19 IST 2012 
+17

* Preguntar cómo eliminar duplicados. La pregunta se marca como duplicada. * – sysfiend

+0

* Esta es una pregunta acerca de cómo eliminar duplicados. Se ha marcado como un duplicado. * –

Respuesta

264

Puede sort continuación uniq:

$ sort -u input.txt 

O utilice awk:

$ awk '!a[$0]++' input.txt 
+38

Prueba con un archivo de texto de 18.500 líneas: 'sort ...' toma aproximadamente 0.57s mientras 'awk ...' toma aproximadamente 0.08s porque 'awk ...' solo elimina duplicados sin clasificación. – Hugo

+2

@Hugo Puedo secundar eso. Prueba contra 2,626,198 líneas 'awk' beats' sort'. Los resultados muestran 'awk' tomando 5.675s y' sort' tomando 5.675s. Curiosamente, el mismo conjunto de registros tomó 15,1 segundos para realizar una consulta DISTINCT de MySQL. –

+0

@TeganSnyder Usted escribió que ambos comandos tomaron exactamente el mismo tiempo para ejecutarse. ¿No 'awk' tomó menos tiempo? – jarno

7

Elimina duplicado, líneas consecutivas de una f ile (emula "uniq").
Se mantiene la primera línea en un conjunto de líneas duplicadas, se eliminan los restos.

sed '$!N; /^\(.*\)\n\1$/!P; D' 
+0

, una adición más para otro uso, si desea cambiar el archivo aquí mismo está el comando 'sed -i '$! N; /^\(.*\)\n\1$/!P; D ' ' –

0

Esto podría funcionar para usted:

cat -n file.txt | 
sort -u -k2,7 | 
sort -n | 
sed 's/.*\t/ /;s/\([0-9]\{4\}\).*/\1/' 

o esto:

awk '{line=substr($0,1,match($0,/[0-9][0-9][0-9][0-9]/)+3);sub(/^/," ",line);if(!dup[line]++)print line}' file.txt 
2

Perl de una sola línea similar a la solución de awk @ de Kev:

perl -ne 'print if ! $a{$_}++' input 

Esta variación elimina los espacios en blanco al final antes de comparar:

perl -lne 's/\s*$//; print if ! $a{$_}++' input 

Esta variación edita el archivo en el lugar:

perl -i -ne 'print if ! $a{$_}++' input 

Esta variación edita el archivo en el lugar, y hace una copia de seguridad input.bak

perl -i.bak -ne 'print if ! $a{$_}++' input 
Cuestiones relacionadas