我正在使用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方面有一些经验,但对两者都很新,并且不知道从哪里开始完成这项任务。任何指针都非常感谢。
答案 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 :(得分: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
基本上它循环遍历第一个文件,然后检查第二个文件是否存在该行,如果它存在则抓取第二个字段(代理)。如果你能更好地解释输出文件的事情,我会给你一个机会。我认为这应该让你走了。