在一个while循环中管道

时间:2017-07-11 04:44:33

标签: bash csv while-loop bioinformatics

让我先道歉,因为我当然不是编码员,但我需要使用.sh脚本(在Windows平台上运行Git Bash - 工作要求)来开发生物信息学解决方案我的数据。

我怀疑我的问题与父和子shell变量有关,但是有一些异常现象。首先,脚本在运行减去循环而不解析.csv文件时起作用。如果我在echo命令之后直接找到done < test.csv,则脚本可以完美地用于我的.csv文件中的最后一行,但不会为其他行生成输出文件。但是,如果done < test.csv位于我脚本的末尾,它会生成所需的文件,然后重命名并移动它们(甚至包含来自循环的用户变量和样本变量)但是它们几乎都是空的数据。 / p>

非常感谢任何帮助。我已经仔细阅读了许多相关问题但是我未能成功实施他们的解决方案。

示例.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

1 个答案:

答案 0 :(得分:6)

正如评论中所提到的,代码中存在一些特定的和一些更普遍的问题。一般的问题是,你不是使用适当的专用工具来解决问题,而是从头开始,用低效率和天真的方式从头开始重写这些工具。 1

因此,解决您所有困境的方法是:学会使用现有工具。不幸的是,第一步是找到这些工具,最好的方法是阅读方法论文并访问序列分析课程。

有很多可供选择; here’s a small selection。但是,出于特定目的,我建议使用cutadapt进行适配器修剪,使用biobambam进行重复数据删除 - 但是,我建议反对重复数据删除,因为这会低估您的表达式信号。

1 我说的是“天真地”,但请不要亲自接受:这实际上是Bash中令人印象深刻的壮举。但是现有工具可以更好地完成,例如,删除带有排序错误的适配器,部分适配器等;而如果整个适配器存在而没有排序错误,您的代码将只找到适配器。因此,遗憾的是,在许多实际情况下,您的方法都会失败。