我确信一定有办法做到这一点,但我被困住了,所以希望得到你的帮助。我有两个文件,如下所示:
文件1:
8750 11.29592283
8800 7.500359335
14150 3.281781819
23850 3.668931975
23900 14.69918465
23950 5.259260427
27300 3.374571119
文件2:
hypothetical protein CDS 7152 7346 TK0006
hypothetical protein CDS 7399 7614 TK0007
DNA methylase CDS 7655 8755 TK0008
hypothetical protein CDS 8760 10093 TK0009
hypothetical protein CDS 10095 10379 TK0010
hypothetical protein CDS 10385 10807 TK0011
file1为基因组坐标和表达值; File2是基因组注释。我需要的是column1 file1中的值是否在column2 file2和column3 file3之间;返回每个文件的完整行。例如,file1 的前两行将返回以下输出:
8750 11.29592283 DNA methylase CDS 7655 8755 TK0008
8800 7.500359335 hypothetical protein CDS 8760 10093 TK0009
使用简短的 awk 命令或类似命令可以实现这样的过程吗?还是我贪多嚼不烂?
谢谢!!
答案1
awk解决方案:
awk -F'[[:space:]][[:space:]]+' 'NR==FNR{ a[$1]=$0; next }
{ for(i in a) {
if (int(i) >= $2 && int(i) <= $3) {
print a[i],$0; delete a[i]; break
}
}
}' File1 OFS='\t' File2
输出:
8750 11.29592283 DNA methylase CDS 7655 8755 TK0008
8800 7.500359335 hypothetical protein CDS 8760 10093 TK0009
-F'[[:space:]][[:space:]]+'
- 定义字段分隔符的模式a[$1]=$0
- 从中获取关键价值File1
if (int(i) >= $2 && int(i) <= $3)
- 检查第一个字段值是否File1
在范围内(在第二个和第三个字段值之间File2
)delete a[i]
- 删除匹配的值break
- 打破循环以避免冗余迭代