Удалить дубликаты строк в файле ~/.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 на путь к необходимому файлу…