Короткий ответ: ничего.
Если процесс ничего не принимает в STDIN, вы все равно можете передать его по конвейеру. Точно так же вы все еще можете передать данные из процесса, который ничего не создает в STDOUT. По сути, вы просто передаете один индикатор EOF во второй процесс, который просто игнорируется. Конструкция с использованием пайпа — это просто вариация на тему «каждый процесс запускает еще два». Эта форк-бомба также может быть (а иногда и так) записана так:
:(){ :&:; }; :
Если первый рекурсивный вызов сразу становится фоновым, то выполняется второй вызов.
В целом, да, символ вертикальной черты (|
) используется для того, чтобы сделать именно то, что вы упомянули — подключить STDOUT первого процесса к STDIN второго процесса. Это также то, что он делает здесь, хотя единственное, что когда-либо проходит через этот канал, - это единственный индикатор EOF.
Для Unix, таких как MacOS/BSD/Solaris, вам нужно передать пустую строку в sed
, чтобы избежать проблемы, с которой столкнулась Эмили, поэтому ответ будет:
while read -r line
do
echo $line
sed -i "" "/$line/d" /my/path/ITS.OTU.table.tsv
done < /my/path/species.txt
grep -v -xF -f /my/path/species.txt /my/path/ITS.OTU.table.tsv >/my/path/ITS.OTU.table.tsv.new
Это будет писать /my/path/ITS.OTU.table.tsv.new
. Его содержимым будут все строки исходного файла, которые не совпадают точно со строкой в /my/path/species.txt
.
Опция -xF
заставляет строку -полностью совпадать с идентичной строкой, а -f filename
считывает строки для сопоставления из заданного файла. -v
меняет смысл совпадения, так что возвращаются только строки , не соответствующие .
Если вам нужно ослабить соответствие, чтобы строка, считанная из /my/path/species.txt
, могла соответствовать в любом месте в каждой строке /my/path/ITS.OTU.table.tsv
, удалите параметр -x
.
Если вы знаете, где в каждой строке должно проверяться совпадение, можно использовать awk
для сравнения только этих битов данных, но в настоящее время мы не знаем, как выглядят ваши данные.