对子目录中的文件进行Grep,并为每个目录写出文件



我正在研究一个生物信息学工作流,在该工作流中,有问题的工具"salmon"创建了多个具有"quant.sf"文件的目录。我想在这些文件中找到所有"lnc"条目,并将它们保存为所有目录的"lnc.sf"。我以前在跑步cat quant.sf | grep 'lnc' > lnc.sf在所有单独的目录中,这似乎解决了我的问题。现在我想编写一个脚本,进入每个目录并生成一个lnc.sf文件。我试过做

find . -name "quant.sf" | while read A
do 
cat $A | grep 'lnc' > lnc.sf
done

但这只是在当前目录中创建了一个连接的lnc.sf文件。非常感谢您的帮助。非常感谢。

如果所有的quant.sf文件都在同一层次结构级别,假设文件夹结构类似month/day/quant.sf:

grep -h 'lnc' */*/quant.sf > lnc.sf

否则,请查找文件,注意使用find+read而不是exec或xargs;理解使用空格进行变量扩展,去掉多余的cat进程,并将文件写入正确的目录:

find . -name 'quant.sf' | while IFS= read -r A
do 
grep 'lnc' "$A" > "${A%/*}/lnc.sf"
done

如果您有GNU find+xargs,请将-print0-0:结合使用

find . -name 'quant.sf' -print0 | xargs -0 -n1 sh -c 'grep "lnc" "$1" > "${1%/*}/lnc.sf"' -

或者使用find的-exec,避免了奇怪文件名的问题:

find . -name 'quant.sf' -exec sh -c 'grep "lnc" "$1" > "${1%/*}/lnc.sf"' - ';'

相关内容

  • 没有找到相关文章

最新更新