awk根据坐标范围和精确匹配在字段中打印文本

awk根据坐标范围和精确匹配在字段中打印文本,awk,Awk,在下面的awk中,我试图将file1的$4中的值与file2中$4中第一个之前的值进行匹配。我将$4的值存储在file1的A中。然后,我将$2中的值选为min,将$3中的值选为max,将$1中的值选为chr。 如果中的$1等于数组[1],则我使用min、max和chr中存储的值来检查$2、$3和$/code>文件2中的$1值之间是否存在重叠。如果有重叠,则打印,但如果没有缺失,则打印。我试图确保行匹配,并且坐标包含在从file1到file2的范围内。我的实际数据是数千行,全部采用以下格式,fil

在下面的awk中,我试图将
file1
$4
中的值与
file2
$4
中第一个
之前的值进行匹配。我将
$4
的值存储在
file1
A
中。然后,我将
$2
中的值选为
min
,将
$3
中的值选为
max
,将
$1
中的值选为
chr
。 如果
中的
$1等于
数组[1]
,则我使用
min
max
chr
中存储的值来检查
$2
$3
$/code>文件2中的
$1值之间是否存在重叠。如果有
重叠,则打印
,但如果没有
缺失,则打印
。我试图确保行匹配,并且坐标包含在从
file1
file2
的范围内。我的实际数据是数千行,全部采用以下格式,
file2
中的每一行都应该匹配。我也评论了
awk
,希望它能帮助我解决语法错误,也许还有更好的方法,但我想试试看

如果我删除
{split($4,array,“”)}
并删除
数组[1]
,我会得到当前输出,但不是所有的行都被打印出来,只有
重叠的行被打印出来,我不确定是否只会打印出精确的匹配

文件1
制表符分隔

chr19   42373737    42373856    RPS19
chr6    32790021    32790140    TAP2
chr19   42364844    42364915    RPS19_cds_1_0_chr19_42364845_f  0   +
chr19   42365180    42365281    RPS19_cds_2_0_chr19_42365181_f  0   +
chr19   42373100    42373284    RPS19_cds_3_0_chr19_42373101_f  0   +
chr19   42373768    42373823    RPS19_cds_4_0_chr19_42373769_f  0   +
chr19   42375418    42375445    RPS19_cds_5_0_chr19_42375419_f  0   +
chr19   42364844    42364915    RPS19_cds_1_0_chr19_42364845_f  0   +     missing
chr19   42365180    42365281    RPS19_cds_2_0_chr19_42365181_f  0   +     missing 
chr19   42373100    42373284    RPS19_cds_3_0_chr19_42373101_f  0   +     missing
chr19   42373768    42373823    RPS19_cds_4_0_chr19_42373769_f  0   +     overlap
chr19   42375418    42375445    RPS19_cds_5_0_chr19_42375419_f  0   +     missing
文件2
制表符分隔

chr19   42373737    42373856    RPS19
chr6    32790021    32790140    TAP2
chr19   42364844    42364915    RPS19_cds_1_0_chr19_42364845_f  0   +
chr19   42365180    42365281    RPS19_cds_2_0_chr19_42365181_f  0   +
chr19   42373100    42373284    RPS19_cds_3_0_chr19_42373101_f  0   +
chr19   42373768    42373823    RPS19_cds_4_0_chr19_42373769_f  0   +
chr19   42375418    42375445    RPS19_cds_5_0_chr19_42375419_f  0   +
chr19   42364844    42364915    RPS19_cds_1_0_chr19_42364845_f  0   +     missing
chr19   42365180    42365281    RPS19_cds_2_0_chr19_42365181_f  0   +     missing 
chr19   42373100    42373284    RPS19_cds_3_0_chr19_42373101_f  0   +     missing
chr19   42373768    42373823    RPS19_cds_4_0_chr19_42373769_f  0   +     overlap
chr19   42375418    42375445    RPS19_cds_5_0_chr19_42375419_f  0   +     missing
所需输出
制表符分隔

chr19   42373737    42373856    RPS19
chr6    32790021    32790140    TAP2
chr19   42364844    42364915    RPS19_cds_1_0_chr19_42364845_f  0   +
chr19   42365180    42365281    RPS19_cds_2_0_chr19_42365181_f  0   +
chr19   42373100    42373284    RPS19_cds_3_0_chr19_42373101_f  0   +
chr19   42373768    42373823    RPS19_cds_4_0_chr19_42373769_f  0   +
chr19   42375418    42375445    RPS19_cds_5_0_chr19_42375419_f  0   +
chr19   42364844    42364915    RPS19_cds_1_0_chr19_42364845_f  0   +     missing
chr19   42365180    42365281    RPS19_cds_2_0_chr19_42365181_f  0   +     missing 
chr19   42373100    42373284    RPS19_cds_3_0_chr19_42373101_f  0   +     missing
chr19   42373768    42373823    RPS19_cds_4_0_chr19_42373769_f  0   +     overlap
chr19   42375418    42375445    RPS19_cds_5_0_chr19_42375419_f  0   +     missing
awk

awk ' # call awk script
 BEGIN { FS=OFS="\t" }  # define FS and OFS as tab
  FNR==NR{  # start processing same line in files
   a[$4];  # store gene in 
   min[$4]=$2;  # store staring coordinate
   max[$4]=$3;  # store ending coordinate
    next         # process next line
}  # close block
 {  # start block
   split($4,array,"_");   # split $4 on _ and store in array[1]
   print $0,(array[1] in a) && ($2>=min[array[1]] && 
$2<=max[array[1]])?"overlap":"missing" # print all lines followed by 
overlap or missing depending on condition (if array[1] = a and $2 in 
file2 is greater than or equal to min and $3 in file2 greater than or 
equal to max print overlap, else missing)
}  # close block
' file1 file2  # define input

这里是超级明星
awk
拯救: 也看不到您的输入文件是实际的制表符分隔的,因此在此代码中也要在
Input\u file1
之前使用
FS=“\t”

awk 'FNR==NR{a[$4];min[$4]=$2;max[$4]=$3;next} {split($4,array,"_");print $0,(array[1] in a) && ($2>=min[array[1]] && $2<=max[array[1]])?"overlap":"missing"}'  Input_file1  OFS="\t"   Input_file2

如果(…){$match gene在文件1
中应该有一个
#
来代替
$
,除非你正在尝试一些我不理解的东西。我已经修复了你的标记语法。如果你的代码足够窄,不需要水平滚动也可以看到,这会有帮助。你的缩进意味着你的最后一个
下一个
是第二个command在
for
循环中,但它实际上在
if
语句中(就像你的
的no-op命令“missing”
)。然后,你的另一个
next
也奇怪地缩进了,所以这可能是你的意图。我想如果你缩进并显式地应用了花括号(例如,转到
for
循环,而不是使用隐式分组),您可能会发现您的问题。在没有实际发布语法错误的情况下告诉我们“我遇到语法错误”是没有用的。