我是一名生物学家,开始学习一些基本的脚本技能来处理大型DNA序列数据集。所以请放轻松我。我在bash中这样做。我有一个文件,我的数据格式如下:
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语句,说“if sample = $ i然后将整行写出一个名为sample的文件。$ i”这是我的代码到目前为止:
#!/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
选项可以将外部变量传递给它,但我不知道如何在这种情况下应用它。我试图在for
语句中移动awk
循环,但这也不会产生所需的结果。任何帮助将不胜感激。
答案 0 :(得分:1)
您可以awk
直接写入所需的输出文件,而无需shell循环:
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;