Eliminar líneas basadas en duplicados dentro de una columna sin ordenar

30

Tengo archivos grandes de 3 columnas (~ 10,000 líneas) y me gustaría eliminar líneas cuando el contenido de la tercera columna de esa línea aparezca en la tercera columna de otra línea. Los tamaños de los archivos hacen que la ordenación sea un poco engorrosa, y no puedo usar algo como el siguiente código porque las líneas completas no son idénticas; solo el contenido de la columna 3.

awk '!seen[$0]++' filename
Zach C
fuente

Respuestas:

31

Simplemente cambie su comando awk a la columna que desea realizar para eliminar las líneas duplicadas basadas en (en su caso, la tercera columna):

awk '!seen[$3]++' filename

Este comando está diciendo awkqué líneas imprimir. La variable $3contiene todo el contenido de la columna 3 y los corchetes son de acceso a la matriz. Por lo tanto, para cada tercera columna de línea en el nombre de archivo, el nodo de la matriz nombrada seense incrementa y la línea se imprime si el contenido de ese nodo (columna3) no se estableció ( !) previamente.

El awkcomando anterior funcionará si sus columnas en el archivo de entrada están delimitadas con ellas mismas spaceo Tabentre ellas, si las columnas están delimitadas con algo más, debe indicarle a awk con su -Fopción. Entonces, por ejemplo, si todas las columnas se delimitan con una coma ( ,) y desea eliminar líneas de base en la -F','opción de uso de la tercera columna .

awk -F',' '!seen[$3]++' filename
αғsнιη
fuente
18

sortEl comando ya está optimizado para manejar grandes archivos. Por lo tanto, podría usar el sortcomando en su archivo como,

sort -u -t' ' -k3,3 file
  • -u - imprime solo las líneas únicas.
  • -t- especifique el delimitador. Aquí en este ejemplo, solo uso el espacio como delimitador.
  • -k3,3 - ordenar en el 3er campo.

Puede consultar esta respuesta que sugiere que la ordenación de GNU es, de hecho, el mejor enfoque para ordenar archivos grandes. En su caso, creo que incluso sin -parallelusted, podría lograr su resultado final sin mucho retraso.

Ramesh
fuente
Estaba a punto de comentar sarcásticamente que -usolo eliminaría las líneas duplicadas , no las claves duplicadas ... pero me equivoco.
Randoms
@Ramesh hace el trabajo, pero la clasificación cambia la secuencia de líneas que supongo que no siempre se esperaba.
Bharat