循环 sed 从文本文件中删除字符串列表中提供的字符串行

循环 sed 从文本文件中删除字符串列表中提供的字符串行

我正在使用这个 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

相关内容