awk根据坐标范围和精确匹配在字段中打印文本
在下面的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
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
循环,而不是使用隐式分组),您可能会发现您的问题。在没有实际发布语法错误的情况下告诉我们“我遇到语法错误”是没有用的。