2013-12-10 261 views
0

我是一个生物学家,开始必须学习一些基本的脚本技能来处理大型DNA序列数据集。所以请对我轻松点。我在bash中完成了这一切。我有此格式我的数据文件:for循环和如果在awk语句

CLocus_58919_Sample_25_Locus_33235_Allele_0 
TGCAGGTGCTTCCAGTTGTCTTTGTAGCGTCCCACCATGATCTGCAGGTCCTTG 
CLocus_58919_Sample_9_Locus_54109_Allele_0 
TGCAGGTGCTTCCAGTTGTCTTTGTAGCGTCCCACCATGATCTGCAGGTCCTTG 

我需要的是做的是循环遍历该文件,并从同一样品的所有序列写入自己的文件。只是要清楚,这些序列来自样品25和9。所以我的想法是用awk格式化我的文件中按以下方式:

CLocus_58919_Sample_25_Locus_33235_Allele_0_TGCAGGTGCTTCCAGTTGTCTTTGTAGCGTCCCACCATGATCTGCAGGTCCTTG 
CLocus_58919_Sample_9_Locus_54109_Allele_0_TGCAGGTGCTTCCAGTTGTCTTTGTAGCGTCCCACCATGATCTGCAGGTCCTTG 

然后通过管道进入另一个AWK这个if语句,如果样品说” = $然后我写出来的是整条生产线,以一个文件名为sample $我”这是我到目前为止的代码:

#!/bin/bash 

a=`ls /scratch/tkchafin/data/raw | wc -l`; 
b=1; 
c=$((a-b)); 

mkdir /scratch/tkchafin/data/phylogenetics 

for ((i=0; i<=$((c)); i++)); do 
    awk 'ORS=NR%2?"_":"\n"' $1 | awk -F_ '{if($4==$i) print}' >> /scratch/tkchafin/data/phylogenetics/sample.$i 
done; 

我明白这是行不通的,因为$i是单引号这样的bash是不承认它。我知道awk有一个-v选项用于将外部变量传递给它,但我不知道如何在这种情况下应用该选项。我试图在awk声明中移动for循环,但是这不会产生所需的结果。任何帮助将非常感激。

+0

我的perl使用经验有限。问题是我非常大的管道的其余部分已经写成bash。 – user3087875

+0

我知道学习曲线看起来更加令人生畏,但这是一个非常适合perl字符串解析的问题。您可以通读这些行并将您需要的数据收集到字符串数组的散列中,例如 $样品{ 'CLocus_58919_Sample_25'=> { 'Locus_33235_Allele_0'=> 'TGCAGGTGCTTCCAGTTGTCTTTGTAGCGTCCCACCATGATCTGCAGGTCCTTG', '一些其他locaus AMD等位基因'=> 'DNA序列' } } 一旦这样做了遍历和写入文件/文件会相对容易 –

+0

previouse评论真的没有出来我想要的方式,对不起。 您仍然可以使用您拥有的bash脚本。只需为它的这一部分调用一个perl脚本即可。 –

回答

1

你可以awk直接写入所需的输出文件,无壳循环:

awk -F_ '(NR % 2) == 1 { line1 = $0; fn="/scratch/tkchafin/data/phylogenetics/sample."$4; } 
     (NR % 2) == 0 { print line1"_"$0 > fn; }' "$1" 

而是要表明你将如何在你的版本中使用-v,这将是:

for ((i=0; i<=$((c)); i++)); do 
    awk 'ORS=NR%2?"_":"\n"' $1 | awk -F_ -v i=$i '$4 == i' >> /scratch/tkchafin/data/phylogenetics/sample.$i 
done; 
+0

非常感谢。这正是我所需要的。我以为我曾试过这件事,但显然不是。 – user3087875