我正在使用这个 sed 脚本来删除 OTU 表中的整行,当在我的 OTU 表中找到文本文件中列出的物种时。
我现在拥有的但不起作用的脚本如下,但我无法使其工作。无论如何,如果您能尽快帮助我,我将不胜感激。
(读取每一行,在我的表中搜索它并删除行,infile)
for i in $(cat /my/path/species.txt); do
sed -i '/"$i"/d' /my/path/ITS.OTU.table.tsv
done
非常感谢
答案1
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
仅比较这些数据位,但我们目前不知道您的数据是什么样的。
答案2
这是你的脚本:
while read -r line
do
echo $line
sed -i "/$line/d" /my/path/ITS.OTU.table.tsv
done < /my/path/species.txt
echo $line 更多的是出于调试原因,因此最终将其删除。
答案3
对于unix,例如MacOS/BSD/Solaris,您需要传递一个空字符串以sed
避免Emilie遇到的问题,所以答案是:
while read -r line
do
echo $line
sed -i "" "/$line/d" /my/path/ITS.OTU.table.tsv
done < /my/path/species.txt