Просто напомню. Для получения уникальных значений файла служит программа uniq. Беда в том, что она работает только с отсортированными данными.

sort "filename"|uniq

Я уже также приводил конструкцию на awk которая извлекает из файла уникальные значения, но без требования сортировки:

awk '!a[$0]++' $RF

Она основана на использовании ассоциативных массивов, у которых ключ (текстовый индекс) всегда уникален.

Я подумал, что на bash такое тоже можно реализовать, ведь в bash тоже есть ассоциативные массивы. Да, конечно не так изящно, и уж, конечно, не быстро. Но зато чистый bash. Но может кому-то пригодится. Приведу сразу все примеры:

#!/bin/bash

clear
declare RF="./rnd_file.txt"
:> $RF # создали файл 10000 значений
# в диапазоне 0-4
for i in {1..10000};do
  echo $(($SRANDOM%5))>>$RF
done

echo '#results'
echo '#sort|uniq'
sort $RF|uniq

echo '#uniq on AWK'
awk '!a[$0]++' $RF

echo '#uniq on #BASH'
declare -A A=
cat $RF |
  while read -e rec;do
    ((A["$rec"]++)) || echo "$rec"
  done

#results
#sort|uniq
#0
#1
#2
#3
#4
#uniq on AWK
#1
#2
#4
#0
#3
#uniq on #BASH
#1
#2
#4
#0
#3
Роман Шубин
Роман Шубин
CEO & CTO, Главред в «Цифровой улей»
Задать вопрос
Напомню, что алгоритм на awk/bash держит весь массив уникальных значений в памяти, поэтому при больших файлах ее может потребоваться много.

Хотя при реализации на bash, Вы скорее умрете от старости, чем закончится память :-)