我有几个大文本文件,在文件中我有一个来自另一个文件的UNIQS.txt
字符串列表。grep
我使用的代码是
grep -f UNIQS.txt EEP_VSL.uniqs.sam > UNIQ_templates.sam
它什么也不做 - 生成的文件是空的。但当我这样做时
grep -F -f UNIQS.txt EEP_VSL.uniqs.sam > UNIQ_templates.sam
它工作正常。这让我感到困惑,因为我认为grep
不会将文件中的条目解释UNIQS.txt
为不带引号和斜杠的正则表达式模式(文件中没有)。一般来说,如果您从文件中获取模式,那么它会自动认为它们是正则表达式模式吗?
编辑:在UNIQS.txt
文件中,有以下形式的换行符分隔的字符串
HWI-ST365:215:D0GH0ACXX:2:1101:10034:186783
(称为模板名称)和文件EEP_VSL...
选项卡分隔列,大约有 14 列,第一列是模板名称,所以基本上我想提取文件中每个模板对应的行。
答案1
该-f
选项指定 grep 读取模式的文件。这就像在命令行上传递模式(-e
如果有多个模式,则使用选项),只不过当您从 shell 调用时,您可能需要引用模式以保护其中的特殊字符不被 shell 扩展。
参数-E
or-F
或-P
,如果有的话,告诉 grep 模式是用哪种语法编写的。如果没有参数,grep 期望基本正则表达式;与-E
, grep 期望扩展正则表达式; with -P
(如果支持的话),grep 期望Perl正则表达式;对于-F
,grep 需要文字字符串。模式是来自命令行还是来自文件并不重要。
请注意,字符串是子字符串:如果您a+b
作为模式传递,则a+b+c
匹配包含的行。如果您想搜索仅包含所提供字符串之一且不再包含更多字符串的行,请传递该-x
选项。
答案2
我遇到了同样的错误,但没有用 @gilles 的好答案解决。仔细查看输入文件,我发现末尾有 2 个换行符。没有这些,成功,只需要: grep -i file_pattern_input file
(GNU grep 3.1,输入文件超过5000条记录,匹配/模式文件2536,我知道所有2536都必须在文件中。使用换行符可以获得文件的所有行,而只有2536个匹配行)