Удаление определенных строк и дубликатов из текстового файла списка слов на 11 ГБ

У меня есть файл списка слов размером 11 ГБ, который уже отсортирован, так как каждое слово находится в отдельной строке.

Мне нужно удалить дубликаты и строки, начиная с 077.

Думаю, мне нужно запустить sed и sort -u вместе, но я также хочу вывод в реальном времени (показать, что происходит в терминале) и, если возможно, показать оставшееся время. Все это в одной команде, и она должна быть в состоянии оптимально работать с полной производительностью в Ubuntu 12.10.

Время не очень важно, но если у меня есть способ рассчитать ETA, я мог бы позаимствовать процессор моего отца на i7, который должен обрабатывать его быстрее, в противном случае мне придется использовать более старый процессор Core 2 .

Поэтому, пожалуйста, дайте мне полную команду, будь то sed / sort / awk, чтобы сделать это (в зависимости от того, что наиболее оптимально).

3
задан 3 January 2013 в 22:38

2 ответа

tee и tail -f оба хорошие команды для следующего действие, поскольку файлы записаны, но ни помогут Вам с ETA Вашей команды вида (и при этом они не позволят Вам видеть то, что продолжается под капотом вида-u; просто окончательный результат после большей части работы сделан),

Любой канал Ваш вывод через tee (который и запишет в 'output_file' и stdout):

sort -u input_file | tee output_file

или используйте tail -f:

sort -u input_file -o output_file &
tail -f output_file

Дополнительно: если Ваш вход предварительно отсортирован (поскольку Ваш вопрос предлагает), и все, что Вы хотите, должен удалить смежные дублирующиеся строки, то uniq намного быстрее, чем sort -u (и наша мишень/хвост на самом деле будет полезным способом контролировать прогресс),

uniq input_file | tee output_file
0
ответ дан 3 January 2013 в 22:38

Как вы уже поняли, вам нужно использовать sort -u для удаления всех дублированных строк. sort однако не поддерживает показ прогресса.

Тем не менее, вы можете написать небольшой скрипт, который считывает содержимое из входного файла и выводит его на стандартный вывод, и пока он это делает, он печатает ход выполнения. Вот пример:

#!/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

Вы можете использовать этот скрипт следующим образом:

./script-name input-file | sort -u > output-file

Прогресс не будет учитывать время, которое sort будет использовать для фактической записи вывод, однако это значительно меньше, чем время, необходимое для чтения входного файла. Это должно быть наиболее эффективным решением на основе оболочки.

0
ответ дан 3 January 2013 в 22:38

Другие вопросы по тегам:

Похожие вопросы: