sublime repetidas online lineas fotos eliminar duplicados duplicadas datos contar buscar archivos shell scripting filter uniq

shell - repetidas - Unix: eliminar líneas duplicadas sin ordenar



eliminar lineas duplicadas sublime (8)

Tengo un script de utilidad en Python:

#!/usr/bin/env python import sys unique_lines = [] duplicate_lines = [] for line in sys.stdin: if line in unique_lines: duplicate_lines.append(line) else: unique_lines.append(line) sys.stdout.write(line) # optionally do something with duplicate_lines

Esta funcionalidad simple (uniq sin necesidad de ordenar primero, ordenamiento estable) debe estar disponible como una simple utilidad UNIX, ¿no es así? ¿Tal vez una combinación de filtros en una tubería?

Motivo de la pregunta: necesito esta funcionalidad en un sistema en el que no puedo ejecutar Python desde cualquier lugar


Ahora puedes ver esta pequeña herramienta escrita en Rust: uq .

Realiza un filtrado de exclusividad sin tener que ordenar primero la entrada, por lo tanto puede aplicarse en la transmisión continua.


El blog UNIX Bash Scripting suggests :

awk ''!x[$0]++''

Este comando le dice a awk qué líneas imprimir. La variable $0 contiene todo el contenido de una línea y los corchetes son acceso a la matriz. Entonces, para cada línea del archivo, el nodo de la matriz x se incrementa y la línea se imprime si el contenido de ese nodo no estaba ( ! ) Previamente establecido.


Gracias 1_CR! Necesitaba un "uniq -u" (eliminar los duplicados por completo) en lugar de uniq (dejar 1 copia de los duplicados). ¡Las soluciones awk y perl no se pueden modificar para hacer esto, tu poder! Es posible que también haya necesitado el menor uso de memoria ya que estaré uniéndome a 100.000.000 líneas 8-). Solo en caso de que alguien más lo necesite, simplemente pongo un "-u" en la porción uniq del comando:

awk ''{print(NR"/t"$0)}'' file_name | sort -t$''/t'' -k2,2 | uniq -u --skip-fields 1 | sort -k1,1 -t$''/t'' | cut -f2 -d$''/t''


La solución anterior de Michael Hoffman es corta y dulce. Para archivos más grandes, un enfoque de transformación de Schwartz que implica la adición de un campo de índice usando awk seguido de múltiples rondas de clasificación y uniq implica menos sobrecarga de memoria. El siguiente fragmento funciona en bash

awk ''{print(NR"/t"$0)}'' file_name | sort -t$''/t'' -k2,2 | uniq --skip-fields 1 | sort -k1,1 -t$''/t'' | cut -f2 -d$''/t''


Para eliminar el duplicado de 2 archivos:

awk ''!a[$0]++'' file1.csv file2.csv


Solo quería eliminar todos los duplicados en las siguientes líneas, no en todas partes del archivo. Entonces usé:

awk ''{ if ($0 != PREVLINE) print $0; PREVLINE=$0; }''


Una respuesta tardía - Acabo de encontrarme con un duplicado de esto - pero tal vez valga la pena agregar ...

El principio detrás de la respuesta de @ 1_CR se puede escribir de manera más concisa, usando cat -n lugar de awk para agregar números de línea:

cat -n file_name | sort -uk2 | sort -nk1 | cut -f2-

  • Use cat -n para anteponer números de línea
  • Usar sort -u eliminar datos duplicados
  • Use sort -n para ordenar por número anterior
  • Use cut para eliminar la numeración de línea