【发布时间】:2017-03-01 01:21:05
【问题描述】:
文件1:
chr1 14361 14829 NR_024540_0_r_DDX11L1,WASH7P_468
chr1 14969 15038 NR_024540_1_r_WASH7P_69
chr1 15795 15947 NR_024540_2_r_WASH7P_152
chr1 16606 16765 NR_024540_3_r_WASH7P_15
chr1 16857 17055 NR_024540_4_r_WASH7P_198
和文件2:
NR_024540 11
我需要在file1 中找到匹配的file2 并打印整个file1 + second column of file2
所以输出是:
chr1 14361 14829 NR_024540_0_r_DDX11L1,WASH7P_468 11
chr1 14969 15038 NR_024540_1_r_WASH7P_69 11
chr1 15795 15947 NR_024540_2_r_WASH7P_152 11
chr1 16606 16765 NR_024540_3_r_WASH7P_15 11
chr1 16857 17055 NR_024540_4_r_WASH7P_198 11
我的解决方案在 bash 中很慢:
#!/bin/bash
while read line; do
c=$(echo $line | awk '{print $1}')
d=$(echo $line | awk '{print $2}')
grep $c file1 | awk -v line="$d" -v OFS="\t" '{print $1,$2,$3,$4"_"line}' >> output
done < file2
我更喜欢 FASTER 任何 bash 或 awk 解决方案。输出可以修改,但需要保留所有信息(列的顺序可以不同)。
编辑:
根据@chepner,现在它看起来是最快的解决方案:
#!/bin/bash
while read -r c d; do
grep $c file1 | awk -v line="$d" -v OFS="\t" '{print $1,$2,$3,$4"_"line}'
done < file2 > output
【问题讨论】:
-
是否以某种方式对
file1或/和file2进行了排序? -
将数据存储在适当的数据库中以支持查询数据将是最快的。
-
是的,它们是按照 sor -k 1V,2 -k 2n,2 排序的,但是为这个任务排序并按照我的要求排序是没有问题的。
-
@Geroge:这些数字可以出现在 file1 的任何位置,还是只出现在最后一列?
-
@Geroge, sqlite.org 可能是一个不错的起点,因为它可以找到一个能够比扫描文本文件更快地进行查找的轻量级索引数据库。