要选择的脚本

时间:2014-08-08 15:19:30

标签: bash awk bioinformatics genetics

我正在使用GWAS数据,试图选择连锁不平衡独立基因座。我的方法是对所有重要的SNP进行排序 - >最不重要的,然后去除任何连锁不平衡的SNP(r2> 0.2),其中1KG的列表中的SNP高于它们。

我的文件中我的SNP排名最高 - >最不重要的:

rs2021722
rs1117490
rs2844776
rs971570

我还有一个文件列出了LD中的每个SNP(来自SNAP):

SNP  Proxy  Distance    RSquared    Chromosome  Coordinate_HG18
rs2021722   rs2021722   0   1.000   chr6    30282110
rs2021722   rs885912    502 1.000   chr6    30282612
rs2021722   rs971570    1618    1.000   chr6    30280492
rs2021722   rs2844776   2304    1.000   chr6    30279806
rs2021722   rs1117490   3621    1.000   chr6    30278489
rs1117490   rs1117490   0   1.000   chr6    30278489
rs1117490   rs2517610   230 1.000   chr6    30278259
rs2844776   rs971570    686 1.000   chr6    30280492
rs2844776   rs1117490   1317    1.000   chr6    30278489
rs971570    rs2021722   1618    1.000   chr6    30282110
rs971570    rs1117490   2003    1.000   chr6    30278489

我想执行一个脚本,它将读取第一个文件中的SNP ID,在第二个文件中找到该SNP ID,然后读取"代理"第二个文件的列。如果第二个文件中的代理SNP都不在第一个文件的较低行号中(即文件中的较高位,具有更好的等级),我希望将该SNP ID写入我的输出文件。

在此示例中,我的输出文件如下所示:

rs2021722
rs117490

我在awk和bash方面有一些经验,但对两者都很新,并且不知道从哪里开始完成这项任务。任何指针都非常感谢。

2 个答案:

答案 0 :(得分:2)

awk 'FNR == NR {a[$1]=++n; next}
    FNR > 1 { b[$1] = (!b[$1] || (a[$2] && a[$2]<b[$1])) ? a[$2] : b[$1] } 
    END { for(i in b) if(a[i]<=b[i]) print i }
' file1 file2

注意:

  • 第1行,从第一个文件中对SNP ID进行排名,并将结果保存到数组'a'
  • 第二行,根据第2列获取代理ID的最高排名([$ 2]的最小非空值),并将结果保存到数组'b'。 (FNR> 1跳过标题行)
  • 第3行,打印满足以下条件的键:a [i]&lt; = b [i]

答案 1 :(得分:0)

我不完全理解您尝试对输出文件执行的操作,但是对于从第一个文件中查找第二个文件中的SNP ID,您可以使用此功能。

while read line; do
    val="$line";
    echo "val: $val";
    while read line2; do
       val2=$(echo "$line2" | awk '{print $1}');
       if [ $val == $val2 ] ; then
           echo $val "=" $val2;
           proxy=$(echo "$line2" | awk '{print $2}');
           echo "proxy = $proxy";
       fi
    done < file2.txt
done <file1.txt

基本上它循环遍历第一个文件,然后检查第二个文件是否存在该行,如果它存在则抓取第二个字段(代理)。如果你能更好地解释输出文件的事情,我会给你一个机会。我认为这应该让你走了。