尝试使用此处文档的两个变量来生成 bash 脚本列表。我遇到了这样的问题:我无法将两个变量正确放入脚本中,并且输出文件(只有一个文件)的文件名是cut_cat.sh
,基本上代码被解释为 cat 文本,而不是函数。我该如何改进这个?
这是在 bash shell 环境中。操作系统是Red Hat Linux。
输入文件R2_adaptor
包含Sample_ID:CGATATTCG
(前半部分是样本ID,后半部分是要删除的序列)。它们之间相隔:
.
for n in cat ${FA_PATH}/R2_adaptor;
do first=$(echo $n | cut -d ":" -f 1)
second=$(echo $n | cut -d ":" -f 2)
cat <<- EOF > ${SCRIPTS}/cut_${first}.sh
#!/bin/bash
FA_PATH="/home/xxx/test_files"
cutadapt -a TTCCTCCT -A echo ${second} --cores=14 \
-o ${FA_PATH}/${first}_R1_trim.fastq.gz \
-p ${FA_PATH}/${first}_R2_trim.fastq.gz \
${FA_PATH}/${first}_R1_001.fastq.gz ${FA_PATH}/${first}_R2_001.fastq.gz
EOF
done
${FA_PATH}/R2_adaptor
这是该文件的示例
Sample2:AGAAGTTT
Sample3:TTGGATAT
Sample4:GTAGTATT
Sample5:ATATATAT
Sample6:AACTTGGC
Sample7:GATGGTGA
Sample8:GTCCCTAT
答案1
这很多都是猜测,因为你根本没有告诉我们任何细节,但我思考扩展${FA_PATH}/R2_adaptor
为文件名,我思考您想要做的是迭代文件的内容。这意味着您可能正在寻找的是for n in $(cat ${FA_PATH}/R2_adaptor)
.
然而,尽管如果每行只有一个字符串,这在这里可行,这个比较好习惯使用while
循环来做这样的事情。
我再次猜测您的输入文件有两个由 分隔的字符串:
,例如:
ACTTGCTATAGCGAT:CGATATTCGGCGATAT
如果是这样,你可以这样做:
#!/bin/bash
FA_PATH="/home/xxx/test_files"
SCRIPTS="/path/to/scripts"
while IFS=: read -r first second rest_if_any_ignored; do
cat <<- EOF > "${SCRIPTS}"/cut_"${first}".sh
#!/bin/bash
cutadapt -a TTCCTCCT -A '${second}' --cores=14 \
-o '${FA_PATH}/${first}_R1_trim.fastq.gz' \
-p '${FA_PATH}/${first}_R2_trim.fastq.gz' \
'${FA_PATH}/${first}_R1_001.fastq.gz'
'${FA_PATH}/${first}_R2_001.fastq.gz'
EOF
done < "${FA_PATH}"/R2_adaptor
请注意,我还删除了echo
from -A echo $second
,因为echo
那里只是一个字符串,并且-A
需要删除适配器序列。