使用awk或类似

时间:2017-08-03 02:18:48

标签: arrays bash shell awk compare

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

数据文件:

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

这似乎是一个非常基本的问题,但鉴于我的经验有限,我感到很茫然。非常感谢帮助。

1 个答案:

答案 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