Попробуйте это,
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
Используйте 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 }')
Во-первых, вы отправляете стандартный вывод в своей цепочке команд на /dev/null
, поэтому ваше назначение, скорее всего, будет присваивать нулевое значение. Удалите это. Похоже, вы пытаетесь захватить только первую и последнюю строку вывода; это может быть сложно сделать в одном -вкладыше, но awk
должно быть в состоянии справиться с этим:
var="$(command... | [...] | tee [...] | awk 'NR==1{print $0} END { print $0}')"
Тем не менее, трубы являются простыми существами. Они имеют один вход и один выход. Вы не можете (легко )использовать конвейеры для отправки данных в несколько мест. Самое близкое, что вы сможете получить, это использовать именованные каналы, которые по сути являются временными файлами, которых вы пытаетесь избежать (технически неверно; Очереди FIFO отличаются от файлов, но я упрощаю ).