我想要一个shell脚本来处理许多输入文件。我使用变量作为输入名称和重命名中间文件。无法将输出重定向到文件名。
shell脚本的运行方式如下:
./trim_pair_align_ab1.sh 116102 128861脚本可以正确地回显变量(第15和第16行),它们与期望匹配。
./temp/45739_1_PET22-001_116102_00_trim.fastq
./temp/45739_1_PET22-001_116102_00_trim.fasta当命令重定向输出时,它无法计算文件名
line 17: temp/$(echo $f|sed 's/_trim.fastq/_trim.fasta/'): No such file or directory8 for f in *.fastq
9 do
10 seqtk trimfq -q 0.05 $f > ./temp/$(echo $f|sed 's/.fastq/_trim.fastq/')
11 done
12
13 for f in `eval ls ./temp/*$1*_trim.fastq`;
14 do
15 echo $f
16 echo $(echo $f|sed 's/_trim.fastq/_trim.fasta/')
17 seqtk seq -A $f > ./temp/$(echo $f|sed 's/_trim.fastq/_trim.fasta/')
18 done为什么输出重定向到第10行而不是第17行?什么使第17行成为文字而不是评估?
发布于 2019-06-07 20:22:46
命令替换正在展开;shell只是打印给它的代码,而不是该扩展的结果。对于真正的问题,你会想要看得更远。
仔细查看您的echo,显示命令替换的结果:
./temp/45739_1_PET22-001_116102_00_trim.fasta它已经有了的./temp前缀。
当您在重定向(>./temp/$(...))中添加第二个这样的前缀时,您的代码将尝试在./temp/temp/中创建一个文件。这个目录不存在,所以您会得到一个错误。
尽管如此,更好的实现方式如下:
for f in ./temp/*"$1"*_trim.fastq; do
seqtk seq -A "$f" >"${f%.fastq}.fasta"
donehttps://stackoverflow.com/questions/56500273
复制相似问题