如何在R的fread()中用grep匹配含空格字符串筛选tsv文件行
报错根因
你拼接grep命令时,变量i中包含的空格没有被shell识别为匹配字符串的一部分,shell将Heart解析为grep的匹配参数,空格后的Muscle被误判为你要搜索的第二个文件,因此抛出找不到Muscle文件/目录的错误,最终无匹配数据导入才触发后续的data.frame赋值报错。
解决方案
方法1:手动给匹配字符串加单引号包裹
在拼接命令时,手动给变量i套上shell层的单引号,让shell将整段内容识别为单个匹配参数:
counts_df <- fread(cmd = paste0("grep '", i, "' rna_single_cell_read_count.tsv"), sep = '\t', col.names = col_names) %>% as.data.frame()
注意:该方法仅适用于匹配字符串i本身不含单引号的场景
方法2:用shQuote()函数自动处理引用(更稳妥)
R内置的shQuote()函数会自动将字符串转换为shell可安全识别的引用格式,无需手动处理各类特殊字符的转义,适配所有场景:
counts_df <- fread(cmd = paste0("grep ", shQuote(i), " rna_single_cell_read_count.tsv"), sep = '\t', col.names = col_names) %>% as.data.frame()
额外优化建议
- 如果需要保留原tsv的表头避免手动指定
col_names,可以调整命令同时读取表头行:
# 先取第一行表头,再追加匹配到的行 counts_df <- fread(cmd = paste0("head -n 1 rna_single_cell_read_count.tsv; grep ", shQuote(i), " rna_single_cell_read_count.tsv"), sep = '\t') %>% as.data.frame()
- 若不需要正则匹配,仅需固定字符串匹配,可以给grep加
-F参数提升匹配速度:grep -F
内容的提问来源于stack exchange,提问作者sarahhhhh
相关产品推荐
相关产品推荐

