Linux
May 8, 2020

Удалить дубликаты строк в файле ~/.bash_history без сортировки

Возникла тут одна задачка…

Заметил, что, несмотря на включение опции export HISTCONTROL=ignorespace:erasedups, (а erasedups как бы ответственна за несохранение дубликатов строк в терминале), файл ~/.bash_history все равно разрастается за счет этих самых дубликатов… HISTFILESIZE установлен довольно большой, однако раздражает не размер файла, а другое: при входе в новый терминал все эти дубликаты строк листаются при прокрутке вниз/вверх 🙁

Можно, конечно, не заморачиваться и воспользоваться sort | uniq, однако этот способ отсортирует результат, а для меня важно, чтобы сохранился порядок введенных команд (то бишь строк в этом файле). Немного полистав мануалы, составил команду для того, чтобы удалить дубликаты строк в файле ~/.bash_history без сортировки:

cat ~/.bash_history | awk '!($0 in a) {a[$0];print}' > ~/.bash_history.tmp && mv -f ~/.bash_history.tmp ~/.bash_history

Строка выше делает следующее: сначала читает строки из файла ~/.bash_history; затем, не сортируя, удаляет повторяющиеся строчки и записывает результат в файл ~/.bash_history.tmp; после чего заменяет им старый файл (mv -f означает, что при замене не спрашивать ничего).

Естественно, это можно использовать для любых текстовых файлов, заменив ~/.bash_history на путь к необходимому файлу…