关于bash:选择脚本

Script to select

我正在使用GWAS数据,试图选择独立于连锁不平衡的基因座。我的方法是将所有重要的SNP从最高->最低的排名,然后删除所有连锁不平衡(r2> 0.2)且SNP在列表中的SNP都在1KG之内的所有SNP。

我有一个文件,其SNP排列从最高->最低有效:

1
2
3
4
rs2021722
rs1117490
rs2844776
rs971570

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

1
2
3
4
5
6
7
8
9
10
11
12
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写入我的输出文件。

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

1
2
rs2021722
rs117490

我在awk和bash方面有一定的经验,但是对两者来说都是新手,并且不知道从哪里开始完成此任务。任何指针都将不胜感激。


1
2
3
4
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

注意:

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


我不太了解您要如何处理输出文件,但是关于从第一个文件中查找第二个文件中的SNP ID,您可以使用它。

1
2
3
4
5
6
7
8
9
10
11
12
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

基本上,它循环遍历第一个文件,然后检查第二个文件是否存在该行,如果存在,它将捕获第二个字段(代理)。如果您能更好地解释输出文件,我会给您一个机会。我认为,这应该可以帮助您。