使用 AWK 或类似文件从第二个文件中基于多个条件选择行



我有两个文件,想根据第二个文件(条件文件(满足的多个条件标记一个文件(数据文件(的行。

数据文件:

脚手架 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    .  一 吨 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    .  阿· 002 11001   .  T C 002 13450   .  G A 003 123 .  C T 003 125 .  阿· 003 155 .  一 C 003 500 .  T C 003 983 .  克· 003 1001    .  G T 004 2   .  阿· 004 567 .  T C 004 901 .  C A 004 5672    .  T G 004 9001    .  克· 004 10098   .  A T

条件文件:

脚手架 Locus_type 最小最大值 001外显子 4456 5543 001外显子 5678 6668 001外显子 8955 9939 001外显子10778 13444 002外显子 4785 4800 002 外显子 5200 8000 002外显子 10000 12000 003外显子124 154 003外显子854 1025 004 外显子 21 852 004 外显子 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 在外显子中 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    .  阿· 002 11001   .  T C *SNP IN EXON 002 13450   .  G A 003 123 .  C T 003 125 .  A   G   *SNP IN EXON 003 155 .  一 C 003 500 .  T C 003 983 .  C G *SNP IN EXON 003 1001    .  G T *SNP IN EXON 004 2   .  阿· 004 567 .  T C 004 901 .  C A 004 5672    .  T G 004 9001    .  C G *SNP IN EXON 004 10098   .

使用 awk 的 T 命令失败:

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 和外显子

这似乎是一个非常基本的问题,但鉴于我有限的经验,我不知所措。非常感谢帮助。

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

最新更新