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