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