当尝试从.csv文件中过滤行时,我发生了一个奇怪的事情:
我有两个.csv,一个包含大量数据,另一个包含要从第一个文件中删除的行的标识符(主.csv第一栏中的名称)。
主文件如下:
scaffold_1234_ref0001_1234
scaffold_1234_ref_002_1234
第二个看起来像:
grep -v -f filter.csv data_to_filter.csv > filtered.csv
我一直在使用awk -F, 'a[$1]++{print $1}' data_to_filter.csv
,它的确会产生缺少必要行的输出文件,但是输出文件中缺少的行比预期的要多。
初始数据包含1,142,936行,我尝试删除122,788行,但是在输出文件中删除了123,036行(248个太多!)。
我已经使用{{1}}检查了主数据中的重复项,但这没有发现重复项。
有什么想法吗?我对此很陌生!
答案 0 :(得分:0)
使用grep命令grep -v -f filter.csv data_to_filter.csv
,您正在对每行数据进行部分正则表达式匹配,因此:
scaffold_1234_ref0001_1234
会匹配
scaffold_1234_ref0001_1234567
fooscaffold_1234_ref0001_1234
以及第一个字段中的更多值,它将与每一行其他任何地方的相似字符串匹配。它还将使用任何RE元字符,因此.
表示any character
,依此类推。这两个因素中的一个或两个都可以解释为什么它删除的行比预期的多。而是在特定目标字段的全文本上完全匹配此字符串:
awk -F, 'NR==FNR{filter[$0];next} !($1 in filter)' filter.csv data_to_filter.csv