while 循环中的管道
Pipe within a while loop
让我先道歉,因为我当然不是编码员,但我需要使用 .sh 脚本(运行 in Git Bash在 Windows 平台上 - 工作要求)为我的数据开发生物信息学解决方案。
我怀疑我的问题与父变量和子变量 shell 相关,但存在一些异常情况。首先,脚本在 运行 减去循环并且不解析 .csv 文件时起作用。如果我有 done < test.csv
直接位于 echo 命令之后,脚本可以完美地处理我的 .csv 文件中的最后一行,但不会为其他行生成输出文件。但是,如果 done < test.csv
位于我的脚本的末尾,它会生成所需的文件,然后重命名并移动它们(甚至包含循环中的用户变量和示例变量)但是它们几乎都是空的数据。
如有任何帮助,我们将不胜感激。我煞费苦心地阅读了许多相关问题,但是我未能成功实施他们的解决方案。
示例.csv;
Sample,F_index,R_index
One,dog,cat
Two,dog,cat
Three,cat,dog
代码;
#!/bin/bash
echo "Hello - what is your input file, including file type?"
read -r var1
echo "Please enter user details (eg. name or initials)"
read -r var5
mkdir "$(date +"%Y-%b-%d")"
while IFS="," read -r Sample F_index R_index
do
[ "$Sample" == "Sample" ] && continue
echo "Sample : $Sample"
echo "F_index : $F_index"
echo "R_index : $R_index"
grep -B 1 "$F_index" "$var1" \
| sed "s/""$F_index""/&\n/;s/.*\n//" \
| grep -B 1 --group-separator="$( )" "$R_index" \
| sed "s/""$R_index"".*//" \
| tee "$Sample"_trimmed.fa \
&& sed "/^\s*$/d" "$Sample"_trimmed.fa \
| sort \
| uniq -c \
| sort -nr \
| sed "/^.*>/ d" \
| tr -d " " \
| sed "s/.*[0-9]/>&\n/g" \
| tee "$Sample"_deduplicated.fa \
&& sed "s/>//" "$Sample"_deduplicated.fa \
| sed "/^[0-9]/{N;s/\n//;}" \
| sed "s/^\(.*\)\(^[0-9]\{1,4\}\)/\2,\1/" \
| tee >(wc -l) \
| sed 1i"Sample:,""$Sample""" \
| sed 2i"User:,""$var5""" \
| sed 3i"DATE:,$(date)" \
| sed 4i"Frequency,Unique reads" \
| tee "$Sample"_results.csv \
| mv ./*deduplicated.fa ./"$(date +"%Y-%b-%d")" \
| mv ./*trimmed.fa ./"$(date +"%Y-%b-%d")" \
| mv ./*results.csv ./"$(date +"%Y-%b-%d")"
done < test.csv
正如评论中提到的,您的代码中存在一些具体问题和一些更普遍的问题。普遍的问题是,您没有使用适当的专用工具来解决问题,而是在 Bash 中从头开始重新编写这些工具,效率低下且天真。1
因此,解决您所有问题的方法是:学习使用现有工具。不幸的是,第一步是 找到 这些工具,最好的方法是阅读方法论文和访问序列分析课程。
有很多可供选择; here’s a small selection. But, for your specific purposes, I suggest using cutadapt for the adapter trimming and biobambam 用于重复数据删除 — 但是,我通常建议 反对 读取重复数据删除,因为这会低估您的表达信号。
1 我说的是“天真”,但请不要把这当回事:这实际上是 Bash 中的一项令人印象深刻的壮举。但是现有的工具在移除带有排序错误的适配器、部分适配器等方面做得更好;而如果 whole 适配器存在且没有排序错误,您的代码只会找到适配器。因此,不幸的是,您的方法在许多实际案例中都会失败。
让我先道歉,因为我当然不是编码员,但我需要使用 .sh 脚本(运行 in Git Bash在 Windows 平台上 - 工作要求)为我的数据开发生物信息学解决方案。
我怀疑我的问题与父变量和子变量 shell 相关,但存在一些异常情况。首先,脚本在 运行 减去循环并且不解析 .csv 文件时起作用。如果我有 done < test.csv
直接位于 echo 命令之后,脚本可以完美地处理我的 .csv 文件中的最后一行,但不会为其他行生成输出文件。但是,如果 done < test.csv
位于我的脚本的末尾,它会生成所需的文件,然后重命名并移动它们(甚至包含循环中的用户变量和示例变量)但是它们几乎都是空的数据。
如有任何帮助,我们将不胜感激。我煞费苦心地阅读了许多相关问题,但是我未能成功实施他们的解决方案。
示例.csv;
Sample,F_index,R_index
One,dog,cat
Two,dog,cat
Three,cat,dog
代码;
#!/bin/bash
echo "Hello - what is your input file, including file type?"
read -r var1
echo "Please enter user details (eg. name or initials)"
read -r var5
mkdir "$(date +"%Y-%b-%d")"
while IFS="," read -r Sample F_index R_index
do
[ "$Sample" == "Sample" ] && continue
echo "Sample : $Sample"
echo "F_index : $F_index"
echo "R_index : $R_index"
grep -B 1 "$F_index" "$var1" \
| sed "s/""$F_index""/&\n/;s/.*\n//" \
| grep -B 1 --group-separator="$( )" "$R_index" \
| sed "s/""$R_index"".*//" \
| tee "$Sample"_trimmed.fa \
&& sed "/^\s*$/d" "$Sample"_trimmed.fa \
| sort \
| uniq -c \
| sort -nr \
| sed "/^.*>/ d" \
| tr -d " " \
| sed "s/.*[0-9]/>&\n/g" \
| tee "$Sample"_deduplicated.fa \
&& sed "s/>//" "$Sample"_deduplicated.fa \
| sed "/^[0-9]/{N;s/\n//;}" \
| sed "s/^\(.*\)\(^[0-9]\{1,4\}\)/\2,\1/" \
| tee >(wc -l) \
| sed 1i"Sample:,""$Sample""" \
| sed 2i"User:,""$var5""" \
| sed 3i"DATE:,$(date)" \
| sed 4i"Frequency,Unique reads" \
| tee "$Sample"_results.csv \
| mv ./*deduplicated.fa ./"$(date +"%Y-%b-%d")" \
| mv ./*trimmed.fa ./"$(date +"%Y-%b-%d")" \
| mv ./*results.csv ./"$(date +"%Y-%b-%d")"
done < test.csv
正如评论中提到的,您的代码中存在一些具体问题和一些更普遍的问题。普遍的问题是,您没有使用适当的专用工具来解决问题,而是在 Bash 中从头开始重新编写这些工具,效率低下且天真。1
因此,解决您所有问题的方法是:学习使用现有工具。不幸的是,第一步是 找到 这些工具,最好的方法是阅读方法论文和访问序列分析课程。
有很多可供选择; here’s a small selection. But, for your specific purposes, I suggest using cutadapt for the adapter trimming and biobambam 用于重复数据删除 — 但是,我通常建议 反对 读取重复数据删除,因为这会低估您的表达信号。
1 我说的是“天真”,但请不要把这当回事:这实际上是 Bash 中的一项令人印象深刻的壮举。但是现有的工具在移除带有排序错误的适配器、部分适配器等方面做得更好;而如果 whole 适配器存在且没有排序错误,您的代码只会找到适配器。因此,不幸的是,您的方法在许多实际案例中都会失败。