两个文件之间的grep

时间:2016-05-10 00:18:59

标签: linux grep

我希望在与文件1比较时找到文件2中的匹配行。

file2包含多个列,第一列包含可与file1匹配的信息。

我尝试了以下命令并且没有给出任何匹配的结果(file1中的内容肯定在file2中)。我之前使用过这些命令来比较不同的文件并且它们有效。

b

当我试图grep任何不匹配的东西时,我得到了结果

grep -f file1 file2
grep -Fwf file1 file2

file1包含基因列表(754个基因),每个基因一行

grep -vf file1 file2 

我觉得问题出在我的file1上。当我尝试在我的file1中手动键入几个项目来测试,并使用file2执行grep时,我从file2获得匹配的行。

当我将file1(最初在excel中)的内容复制到制作.txt文件的记事本中时,我没有得到任何匹配的结果。

我看不到我的file1有任何问题。有什么建议吗?

4 个答案:

答案 0 :(得分:1)

我们假设这是file2:

$ cat file2
a b ATM
c d e
f ATR g

使用grep和进程替换

我们可以通过以下方式从file1获取与file2中任何列匹配的行:

$ grep -wFf <(sed 's/[[:space:]]/\n/g' file2) file1
ATM
ATR

这是有效的,因为它将file2转换为grep理解的形式:

$ sed 's/[[:space:]]/\n/g' file2
a
b
ATM
c
d
e
f
ATR
g

使用awk

$ awk 'FNR==NR{for (i=1;i<=NF;i++) seen[$i]; next} $0 in seen' file2 file1
ATM
ATR

这里,awk会跟踪它在file2中看到的每一列,然后只打印file1中与这些列之一匹配的那些行

答案 1 :(得分:1)

你说,

  

我将file1(最初在excel中)的内容复制到制作.txt文件的记事本中

txt文件可能包含回滚grep的回车/换行对。正如我在评论中建议的那样,试试这个:

tr -d '\015' < file1 > file1a
grep -Fwf file1a file2

tr调用将删除所有回车符,为您提供正确的Unix / Linux文本文件,只包含换行符(\n)作为行终止符。

你说:

  

我无法查看文件1的任何问题。

以下是如何查看额外的回车问题:

cat -v test1

每行末尾的那些小^M标记是cat -v显示回车控制代码的方式。

附录:
回车(CR)为十进制13,十六进制0x0d,八进制015,\r在C.
换行(LF)为十进制10,十六进制0x0a,八进制012,\n在C.
因为它是一个老式实用程序,tr接受控制字符的八进制(基数8)表示法。
(我认为在某些版本中tr -d '\r'会起作用,但我不确定,无论如何我不确定你的版本是什么。tr -d '\015'应该是通用的。)

答案 2 :(得分:0)

尝试使用命令

comm 

它是diff

的反转版本

答案 3 :(得分:0)

简单的shell脚本,为file1.txt

中的每个输入执行grep
#!/bin/bash
while read content; do
    grep -q "$content" file2.txt
    if [ $? -eq "0" ]; then
        echo "$content" was found in file2 >> results.txt
    fi
done < file1.txt