我正在研究一个生物信息学工作流,在该工作流中,有问题的工具"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"' - ';'