我有两个文件,并希望根据第二个文件(条件文件)满足的多个条件标记一个文件的行(数据文件)。
数据文件:
Scaffold Nucleotide_position x SNP1 SNP2 001 345 . G T 001 568 . G C 001 1945 . T C 001 5001 . T A 001 5600 . T G 001 6001 . A T 001 10889 . G A 001 12001 . T A 001 15001 . G A 002 45 . C T 002 104 . G T 002 598 . C A 002 4800 . T A 002 5001 . G C 002 7200 . T A 002 9845 . A G 002 11001 . T C 002 13450 . G A 003 123 . C T 003 125 . A G 003 155 . A C 003 500 . T C 003 983 . C G 003 1001 . G T 004 2 . A G 004 567 . T C 004 901 . C A 004 5672 . T G 004 9001 . C G 004 10098 . A T
条件文件:
Scaffold Locus_type Min Max 001 exon 4456 5543 001 exon 5678 6668 001 exon 8955 9939 001 exon 10778 13444 002 exon 4785 4800 002 exon 5200 8000 002 exon 10000 12000 003 exon 124 154 003 exon 854 1025 004 exon 21 852 004 exon 8951 9512
期望的输出:
001 345 . G T 001 568 . G C 001 1945 . T C 001 5001 . T A *SNP IN EXON 001 5600 . T G 001 6001 . A T *SNP IN EXON 001 10889 . G A *SNP IN EXON 001 12001 . T A *SNP IN EXON 001 15001 . G A 002 45 . C T 002 104 . G T 002 598 . C A 002 4800 . T A *SNP IN EXON 002 5001 . G C 002 7200 . T A *SNP IN EXON 002 9845 . A G 002 11001 . T C *SNP IN EXON 002 13450 . G A 003 123 . C T 003 125 . A G *SNP IN EXON 003 155 . A C 003 500 . T C 003 983 . C G *SNP IN EXON 003 1001 . G T *SNP IN EXON 004 2 . A G 004 567 . T C 004 901 . C A 004 5672 . T G 004 9001 . C G *SNP IN EXON 004 10098 . A T
使用awk命令失败:
awk 'NR==FNR{a[$1]=$3 FS=="\t" $4;next}{if (a[$1]==$1 && $3<=$2 && $4>=$2) print $0, "*SNP IN EXON"; else print $0, "";}' Condition_file.txt Data_file.txt
基本上,我想仅标记数据文件中包含核苷酸(SNP)的那些行,所述核苷酸(SNP)落在第二个文件(或条件文件)中列出的每个识别的外显子的范围(最小和最大)内。我每个脚手架有多个SNP和外显子,我认为这会导致awk命令出现问题。
注意:我的真实数据文件有数千个支架,SNP和外显子
这似乎是一个非常基本的问题,但鉴于我的经验有限,我感到很茫然。非常感谢帮助。
答案 0 :(得分:1)
awk '
NR==FNR{ # In condition.txt
min[$1]=min[$1]"-"$3; # Assign the min and max for $1 to array min and max
max[$1]=max[$1]"-"$4; # The delimeter for each value in both array is "-"
next
}
{
split(min[$1],min1,"-"); # split the value in min & max to min1 & max1
split(max[$1],max1,"-");
str=$0;
for(i in min1){
if($2>=min1[i]&&$2<=max1[i]) # if the value of $2 in Data.txt meet the criteria
str=$0"\t*SNP IN EXON"}; # append "\t*SNP IN EXON" to the string
print str
}
' Condition.txt Data.txt