使用grep按含重复行的file2检索file1时如何保留重复匹配结果
问题原因
你当前执行的grep 'ID=transcript:' file1.txt | grep -w -f file2.txt逻辑是先过滤出file1中所有带ID=transcript:的行,再用file2里的所有模式去匹配这些行。grep对每一行输入只会判断是否匹配任意一个模式,匹配就输出一次,不会因为模式在file2里重复出现就重复输出,所以结果会自动去重。
解决方案
方案1:awk实现(效率最高,适合大文件)
先把file1中transcript ID和对应行的映射存在内存里,再按file2的逐行顺序输出对应内容,完全匹配file2的出现顺序和重复次数:
awk ' # 处理第一个文件file1,构建ID到行内容的映射 /FlyBase/ && /ID=transcript:/ { if(match($0, /ID=transcript:([^;]+)/, arr)) { id_map[arr[1]] = $0 } } # 处理第二个文件file2,逐行输出对应内容 FILENAME == "file2.txt" && $0 != "" { if($0 in id_map) { print id_map[$0] } }' file1.txt file2.txt
方案2:循环逐行匹配(简单易用,适合小文件)
遍历file2的每一行ID,单独查一次file1输出匹配结果:
while read -r id; do [ -z "$id" ] && continue grep -w "ID=transcript:$id" file1.txt done < file2.txt
如果file2行数较多,这个方案因为每次循环都要重新读取file1,效率会远低于awk方案。
内容的提问来源于stack exchange,提问作者Amanda F
相关产品推荐
相关产品推荐

