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 适配器存在且没有排序错误,您的代码只会找到适配器。因此,不幸的是,您的方法在许多实际案例中都会失败。