2011-06-10 13 views
7

He all, Tengo un archivo que tiene algunas columnas. Me gustaría hacer una ordenación para la columna 2 y luego aplicar uniq para la columna 1. Encontré este post hablando de ordenación y uniq para la misma columna, pero mi problema es un poco diferente. Estoy pensando en usar algo usando sort y uniq pero no sé cómo. Gracias.cómo ordenar basado en una columna pero uniq basado en otra columna?

Respuesta

7

Puede usar tubería, pero no está en su lugar.

Ejemplo:

$ cat initial.txt 
1,3,4 
2,3,1 
1,2,3 
2,3,4 
1,4,1 
3,1,3 
4,2,4 

$ cat initial.txt | sort -u -t, -k1,1 | sort -t, -k2,2 
3,1,3 
4,2,4 
1,3,4 
2,3,1 

El resultado está ordenada por la llave 2, único por la llave 1. Observe que resultado se muestra en la consola, si lo desea en un archivo, sólo tiene que utilizar una redirección (> newFiletxt)

otra solución para este tipo de operación más compleja es confiar en una herramienta más (dependiendo de sus preferencias (y edad), awk, perl o Python)

EDITAR: Si he entendido bien el nuevo requisito, que está ordenada por Colum 2, columna 1 es único para una determinada columna 2:

$ cat initial.txt | sort -u -t, -k1,2 | sort -t, -k2,2 
3,1,3 
1,2,3 
4,2,4 
1,3,4 
2,3,1 
1,4,1 

¿Es lo que esperas? De lo contrario, yo no entendía :-)

+2

Gracias Bruce por su respuesta. hmhm .... pero mi caso tendrá que ordenar primero y luego uniq.Lo que eso significa es que la primera columna puede tener valores duplicados pero no uno al lado del otro. ¿Alguna idea más? Soy un principiante para awk pero si tienes una buena solución para ello. Me gustaría usarlo Gracias. – Ken

+0

¿Podría proporcionar una muestra de datos y un resultado esperado, p. en http://pastebin.com? No estoy seguro de entender por completo – Bruce

+0

Genial ... este funciona para mí ... aunque no es lo suficientemente robusto para una columna no consecutiva. Lo hará para mi tarea actual. Montones de gracias. – Ken

0

uniq necesita los datos para estar en forma ordenada para trabajar, por lo que si sort el segundo campo y luego aplicar uniq el primer campo, no obtendrá resultado correcto.

es posible que desee probar

sort -u -t, -k1,1 filename | sort -t, -k2,2 
+1

Gracias Lobo ... pero primero tengo que hacer la ordenación y encontrar los únicos en la primera columna en los que puede haber valores duplicados en la columna 1, pero no estarán al lado de cada uno otro. Me sorprende que el comando uniq en Linux no tenga un parámetro para especificar una columna específica. Gracias. – Ken

+0

el comando 'uniq' le da la opción de elegir campos. echa un vistazo a '-f',' s' y otras opciones. ¿Estás buscando 'sort -t '' -k2,2 b | uniq -f1'? ¿Podría proporcionar un ejemplo de entrada y salida que está buscando? – Lobo

+0

pero '-f' y' -s' saltearán el PRIMER número de columnas/caracteres para la comparación de unicidad. No permiten columnas específicas. La segunda respuesta de Bruce funciona para mi tarea actual ahora. Gracias. – Ken

0

sólo para estar seguro de que me dieron lo que quiere decir correctamente. Desea ordenar un archivo basado en la segunda columna del archivo. Luego desea eliminar los duplicados de la primera columna (¡otra forma de decir aplicando uniq a la columna uno!). fresco, para hacer esto, es necesario realizar tres tareas:

  1. ordenar la columna sobre la que se va a aplicar uniq (ya Uniq puede trabajo sólo en la entrada ordenada).
  2. aplicar uniq en la columna ordenada.
  3. ordena la salida según los valores de la columna dos.

El uso de tuberías: El comando es

sort -t ',' -k1 fileName| awk '!x[$1]++' | sort -t ',' -k2 

Tenga en cuenta que no se puede especificar el primer campo de uniq, puede utilizar el interruptor -f para saltar los primeros n campos. Por lo tanto, utilicé awk para reemplazar uniq.

+0

¿Puedes explicar ese comando awk? –

0

He utilizado este sort -t ',' -nk2

aquí ordena

1,2 
2,5 
3,1 

to 

3,1 
1,2 
2,5 
Cuestiones relacionadas