在搜索、阅读并尝试了许多有关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