Если размер выходных данных не слишком велик для размещения в памяти и вам не нужны команды wc
и sort
для параллельной работы из соображений производительности, вот относительно простое решение:
output=$(awk '$13 ~ /type/ {print $15}' filename.txt; echo a)
printf "%s" "${output%a}" | sort -u
printf "%s" "${output%a}" | wc -l
Эта сложность с дополнительным a
заключается в том, что команда awk
может напечатать несколько пустых строк в конце ввода, которые будут удалены конструкцией $()
. Вы можете легко выбрать, какой из sort
или wc
должен отображаться первым.
Вот способ, который работает с любой оболочкой POSIX (ash, bash, ksh, zsh, ...), но только в системах с /dev/fd
(который включает в себя сравнительно недавно Linux, * BSD и Solaris). Подобно аналогичной конструкции Уолтера с использованием более простого метода, доступного в bash, ksh93 и zsh , выходные данные wc
и выходные данные sort
могут быть смешаны.
{
awk '$13 ~ /type/ {print $15}' filename.txt |
tee /dev/fd3 |
wc -l
} 3>&1 1>&3 | sort -u
Если вам обоим нужно иметь дело с промежуточным выводом, который не совсем удобно помещается в памяти и не хотят, чтобы вывод двух команд смешивался, я не думаю, что есть простой способ в оболочке POSIX, хотя это должно быть выполнимо с процессами ksh или zsh.