Tengo alrededor de 350 archivos de texto (y cada archivo es de alrededor de 75 MB). Estoy tratando de combinar todos los archivos y eliminar las entradas duplicadas. El archivo está en el formato siguiente:

ip1,dns1
ip2,dns2
...

Escribí un pequeño script de shell para ello

#!/bin/bash
for file in data/*
do
    cat "$file" >> dnsFull
done
sort dnsFull > dnsSorted
uniq dnsSorted dnsOut
rm dnsFull dnsSorted

Estoy haciendo este proceso a menudo y me preguntaba si hay algo que pueda hacer para mejorar el procesamiento de la próxima vez, cuando lo ejecuto. Estoy abierto a cualquier lenguaje de programación y sugerencias. Gracias!

usted también podría dar a ordenar -m a tratar –> ordenar los archivos individuales y combinarlos en consecuencia, por lo que deberá guardar un poco de tiempo …. la opción-m estaba disponible espl para el escenario como este … es decir sort-m archivo* | uniq -u

OriginalEl autor drk | 2013-06-01

1 Comentario

  1. 35

    Primero apagado, usted no está utilizando todo el poder de cat. El lazo puede ser sustituidas por

    cat data/* > dnsFull

    suponiendo que el archivo está vacío inicialmente.

    A continuación, hay para todos aquellos archivos temporales que la fuerza de los programas que esperar para discos duros (comúnmente la más lenta de las partes en los sistemas informáticos modernos). El uso de una tubería:

    cat data/* | sort | uniq > dnsOut

    Este es todavía el despilfarro desde sort solo puede hacer lo que se está utilizando cat y uniq; la totalidad de la secuencia de comandos puede ser sustituido por

    sort -u data/* > dnsOut

    Si todavía no es lo suficientemente rápido, entonces se dan cuenta de que la ordenación toma O(n lg n) en el tiempo, mientras que la deduplicación se puede hacer en el tiempo lineal con Awk:

    awk '{if (!a[$0]++) print}' data/* > dnsOut
    Muy bien dicho, gracias.
    Tenga en cuenta que el final de awk puede ser simplificado a awk '!a[$0]++' data/*
    He eliminado mi perl respuesta porque 350 * 75 MB = más de 26GB en la memoria de ordenación (como awk) puede causar que demasiada memoria de intercambio.
    Lo siento, ¿qué awk ‘!un[$0]++’? Se compara el primer elemento, o la línea completa?

    OriginalEl autor Fred Foo

Dejar respuesta

Please enter your comment!
Please enter your name here