Как только у вас есть отсортированный файл, содержащий все уникальные
Query <TAB> LocationCode <TAB> IPAddress <NEWLINE>
Вы могли бы:
awk -F '\t' 'NR == 1 {q=$1; l=$2; count=0}
q == $1 && l == $2{count++}
q != $1 || l != $2{printf "%s\t%s\t%d\n", q, l, count; q=$1; l=$2; count=1}
END{printf "%s\t%s\t%d\n", q, l, count}' sorted_uniq_file
Чтобы получить это sorted_uniq_file
, наивный путь может быть:
sort -u dir/* > sorted_uniq_file
Но это может быть очень долго и занимать память.
Более быстрым вариантом (и меньшим потреблением памяти) может быть устранение дублирования как можно скорее, сначала сортировка и последующее объединение. Для этого требуется временное пространство для отсортированного файла, давайте использовать каталог с именем sorted
:
mkdir sorted;
for f in dir/*; do
sort -u $f > sorted/$f
done
sort -mu sorted/* > sorted_uniq_file
rm -rf sorted
Если решение выше достигло некоторого предела оболочки или предела сортировки (расширение dir/*
, или sorted/*
, или количество параметров sort
):
mkdir sorted;
ls dir | while read f; do
sort -u dir/$f > sorted/$f
done
while [ `ls sorted | wc -l` -gt 1 ]; do
mkdir sorted_tmp
ls sorted | while read f1; do
if read f2; then
sort -mu sorted/$f1 sorted/$f2 > sorted_tmp/$f1
else
mv sorted/$f1 sorted_tmp
fi
done
rm -rf sorted
mv sorted_tmp sorted
done
mv sorted/* sorted_uniq_file
rm -rf sorted
Приведенное выше решение может быть оптимизировано для объединения более 2 файлов одновременно.