我遇到了以下问题(为了提出问题我已将其简化)。我有一个这样的模式文件patternfile.txt
,已排序:
ALNTPKDHI
CTDDNALAY
CTDDNALAYY
和一个查找文件lookup.txt
:
ALNTPKDHI 1
CTDDNALAY 2
CTDDNALAYY 3
我运行命令:
$ grep -w -f patternfile.txt lookupfile.txt
它返回这个:
ALNTPKDHI 1
CTDDNALAY 2
第三个条目没有返回匹配项,尽管它应该返回。我会注意到,如果我交换 中最后两个条目的顺序patternfile.txt
,它会返回所有 3 个条目。
有人能解释一下吗?
谢谢你!
答案1
我无法重现:
$ printf '%s\n' ALNTPKDHI CTDDNALAY CTDDNALAYY > patterns.txt
$ printf '%s\n' 'ALNTPKDHI 1' 'CTDDNALAY 2' 'CTDDNALAYY 3' > input.txt
$ grep -w -f patterns.txt input.txt
ALNTPKDHI 1
CTDDNALAY 2
CTDDNALAYY 3
请检查模式或输入是否包含任何异常控制或空白字符,例如回车符。
答案2
如果模式文件的最后一行不完整,即如果最后一行不以终止换行符结束,我只能重现您所看到的内容。当某行不完整时,grep
将不会使用该行。
如果您运行od -c
该文件,您可以看到最后一个字符是什么。这是最后一行的示例不是以换行符结尾:
$ od -c pattern.txt
0000000 A L N T P K D H I \n C T D D N A
0000020 L A Y \n C T D D N A L A Y
0000035
这是文件以换行符结尾时的示例:
$ od -c pattern.txt
0000000 A L N T P K D H I \n C T D D N A
0000020 L A Y \n C T D D N A L A Y \n
0000036
您可以使用以下命令向文件添加换行符
echo >>pattern.txt
如果最初没有换行符,大多数文本编辑器在保存文件时会自动将终止换行符添加到文本的最后一行。