grep -f 模式文件 根据模式文件的内容,要么什么也找不到,要么发现太多

grep -f 模式文件 根据模式文件的内容,要么什么也找不到,要么发现太多

在搜索、阅读并尝试了许多有关grep带有模式列表的行的可能解决方案之后,我正在写作。这是我所知道的一个非常基本的并且已经参加过许多论坛。

但我遇到了以下问题:我有两个文件,我想从较大的文件中 grep 那些行,这些行与较小文件中的模式匹配。

我有一个 file_A.txt (要匹配的模式的单列列表),例如:

comt241_c0_seq1
comt868_c0_seq1
comt685_c0_seq1
comt7977_c0_seq1
comt6723_c0_seq1
comt363_c0_seq1
comt384_c0_seq1

和另一个 file_B.txt (制表符分隔,条目数多于 file_A)

comp5_c0_seq1   0   0   0   6   0   0   0   0   0
comt241_c0_seq1 0   0   0   0   0   0   0   0   0
comt868_c0_seq1 0   0   0   0   0   0   0   0   0
comt363_c0_seq1 0   0   0   0   0   0   0   0   0
comt384_c0_seq1 0   0   0   0   0   0   0   0   0
comp429_c0_seq1 0   0   0   0   0   0   0   0   0
comp452_c0_seq1 0   0   0   0   0   0   0   0   0
comp452_c0_seq2 0   0   0   0   0   0   0   0   0
comp483_c0_seq1 33  8   10  32  0   33  8   0   37
comt685_c0_seq1 0   0   0   0   0   0   0   0   0
comp494_c0_seq1 0   0   0   0   0   0   0   0   0
comt7977_c0_seq1    1   0   0   0   0   0   0   0   0
comp564_c0_seq1 0   0   0   0   0   0   0   0   0
comp596_c0_seq1 0   0   0   0   0   0   0   0   0
comp653_c0_seq1 10  0   0   2   0   0   0   0   0
comp724_c0_seq1 0   0   0   0   0   0   0   0   0
comt6723_c0_seq1    0   0   0   0   0   0   0   0   0

我试过grep -f file_A file_B > file_C

但它返回一个空文件。

所以我使用以下命令从 file_A 中删除了所有空格

sed 's/[ \t]*$//' file_A > new_file_A

但没有成功。我已经尝试了很多方法来删除特殊字符或空格并正确分隔文件,但它要么给了我额外的条目,要么什么也没有。

我认为 file_A 或 file_B 中有一些特殊字符,这很麻烦。我正在使用文本管理员编辑器。

除了 grep 之外还有其他方法吗?

答案1

您的 grep 命令似乎是正确的。除非您使用不同的文件名:

grep -f list_A list_B

代替

~$ grep -f fileA.txt fileB.txt
comt241_c0_seq1 0   0   0   0   0   0   0   0   0
comt868_c0_seq1 0   0   0   0   0   0   0   0   0
comt363_c0_seq1 0   0   0   0   0   0   0   0   0
comt384_c0_seq1 0   0   0   0   0   0   0   0   0
comt685_c0_seq1 0   0   0   0   0   0   0   0   0
comt7977_c0_seq1    1   0   0   0   0   0   0   0   0
comt6723_c0_seq1    0   0   0   0   0   0   0   0   0

答案2

我创建了两个具有相同内容的文件,并grep以相同的方式使用,效果很好。我希望您使用相同的文件名(我看到问题中缺少 .txt 扩展名)。

[sreeraj@server ~]$ grep -f file_A.txt file_B.txt > file_C.txt
[sreeraj@server ~]$ cat file_C.txt
comt241_c0_seq1 0   0   0   0   0   0   0   0   0
comt868_c0_seq1 0   0   0   0   0   0   0   0   0
comt363_c0_seq1 0   0   0   0   0   0   0   0   0
comt384_c0_seq1 0   0   0   0   0   0   0   0   0
comt685_c0_seq1 0   0   0   0   0   0   0   0   0
comt7977_c0_seq1    1   0   0   0   0   0   0   0   0
comt6723_c0_seq1    0   0   0   0   0   0   0   0   0
[sreeraj@server ~]$

dos2unix如果这两个文件名仍然生成空文件,您可以尝试使用它们。

dos2unix file_A.txt
dos2unix file_B.txt

相关内容