Como você já entendeu, você precisa usar sort -u
para remover todas as linhas duplicadas. No entanto, sort
não suporta a exibição de progresso.
Você pode, no entanto, escrever um pequeno script que leia o conteúdo do arquivo de entrada e envie-o para a saída padrão e, ao mesmo tempo, imprima o progresso. Aqui está um exemplo:
#!/bin/bash
set -e
bytes_read=0
byte_count=$(wc -c "$1" | cut -d" " -f1)
chunk_size=500000
while read -N $chunk_size chunk
do
echo -ne "\rRead $bytes_read of $byte_count bytes [$[ 100 * bytes_read / byte_count ]%]" >& 2
echo -n "$chunk"
bytes_read=$[ bytes_read + chunk_size ]
done < "$1"
echo >& 2
Você pode usar este script da seguinte forma:
./script-name input-file | sort -u > output-file
O progresso não levará em consideração o tempo que sort
usará para realmente gravar a saída, no entanto, isso é bem menos do que o tempo necessário para ler o arquivo de entrada. Essa deve ser a solução baseada em shell mais eficiente.