Вывод конвейера из процесса замены в переменную

Попробуйте это,

diff File1 File2 | grep "^<" | sed 's/^< //g' > File3
diff File1 File2 | grep "^>" | sed 's/^> //g' > File4

выход:

cat File3
1|2|3|5
E|F|G|H

cat File4
1|2|3|4
E|F|I|H
1
13.05.2021, 17:23
2 ответа

Используйте awkвместоtee-для двух подстановок процесса grep. Например:

command |... |... | awk '
     /[^3]$/  { c1++; next };
     /[^35]$/ { c2++; next };
     END { print c1, c2 > counts.txt }'

read var1 var2 < counts.txt
rm counts.txt

Если вы не хотите использовать временный файл, вы можете сделать это следующим образом:

read var1 var2 < <(command |... |... | awk '
         /[^3]$/  { c1++; next };
         /[^35]$/ { c2++; next };
         END { print c1, c2 }')
3
28.07.2021, 11:33

Во-первых, вы отправляете стандартный вывод в своей цепочке команд на /dev/null, поэтому ваше назначение, скорее всего, будет присваивать нулевое значение. Удалите это. Похоже, вы пытаетесь захватить только первую и последнюю строку вывода; это может быть сложно сделать в одном -вкладыше, но awkдолжно быть в состоянии справиться с этим:

var="$(command... | [...] | tee [...] | awk 'NR==1{print $0} END { print $0}')"

Тем не менее, трубы являются простыми существами. Они имеют один вход и один выход. Вы не можете (легко )использовать конвейеры для отправки данных в несколько мест. Самое близкое, что вы сможете получить, это использовать именованные каналы, которые по сути являются временными файлами, которых вы пытаетесь избежать (технически неверно; Очереди FIFO отличаются от файлов, но я упрощаю ).

0
28.07.2021, 11:33

Теги

Похожие вопросы