UNIX: использование comm без создания временных файлов

Я хотел использовать comm для сравнения двух списков: один состоит из случайно сгенерированных слов:

cat /dev/urandom | head -n 10000 | strings | tr 'A-Z' 'a-z' | sort

другой - английский словарь:

wget -q0- <URL> | sort

(Я действительно не могу указать URL-адрес). Я попытался сохранить оба списка во временные файлы, а затем использовал comm -12 файл1 файл2, и это сработало, но теперь я хочу сделать это без создания этих временных файлов. Есть ли способ?


person Community    schedule 04.01.2014    source источник
comment
Требуется ли вам оболочка POSIX или приемлемо решение с использованием конструкций Bash или Zsh?   -  person tripleee    schedule 04.01.2014


Ответы (2)


Ваш код (с рефакторингом бесполезного использования cat) можно тривиально переписать для использования Bash. замена процесса:

comm <(head -n 10000 </dev/urandom |
        strings | tr 'A-Z' 'a-z' | sort) <(wget -q0- <URL> | sort)

Однако, если ваша цель не состоит в том, чтобы ускорить тепловую смерть Вселенной, ваш код выглядит крайне неэффективным. Возможно, вам следует объяснить, чего вы пытаетесь достичь? (Кроме того, если вы хотите найти частоту словарных слов в выводе /dev/urandom, я полагаю, что strings будет отфильтровывать любые действительно короткие слова.)

person tripleee    schedule 05.01.2014
comment
Я готовился к экзамену, и это было одно из упражнений, в нем конкретно упоминалось об использовании строк, а в задаче упоминалось, что эффективность на самом деле не проблема. В любом случае ваше решение сработало! Благодарность ! - person ; 07.01.2014

Кстати, я нашел другое решение, не используя comm.

((head -n 10000 </dev/urandom | strings | tr 'A-Z' 'a-z' | sort | uniq) ; (wget -q0- <URL> | sort)) | sort | uniq -d

Это не очень эффективно, но работает (uniq -d печатает только повторяющиеся строки = строки в обоих файлах).

person Community    schedule 07.01.2014