linux - grep 两个文件之间

标签 linux grep

我想在文件 2 中找到与文件 1 相比的匹配行。

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

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

grep -f file1 file2
grep -Fwf file1 file2

当我尝试 grep 任何不匹配的内容时,我得到结果

grep -vf file1 file2 

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

ATM
ATP5B
ATR
ATRIP
ATRX

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

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

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

最佳答案

你说,

I copied the contents of file1 (originally in excel) into notepad making a .txt file

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

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

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

<小时/>

你说:

I can't see any problem with my file1.

查看额外回车问题的方法如下:

cat -v test1

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

<小时/>

附录:
回车符 (CR) 在 C 语言中为十进制 13、十六进制 0x0d、八进制 015、\r
换行符 (LF) 在 C 中是十进制 10、十六进制 0x0a、八进制 012、\n
因为它是一个老式实用程序,所以 tr 接受八进制(基数 8)控制字符表示法。
(我认为在某些版本中 tr -d '\r' 可以工作,但我不确定,而且我不确定您拥有什么版本。tr -d '\015' 应该是通用的。)

关于linux - grep 两个文件之间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37127398/

相关文章:

bash - 文档中唯一单词的数量

mysql - 如何将 grep 结果的值设置为 bash 中的变量?

awk - 从以特定模式开头的文件中获取正则表达式模式

regex - egrep 行以 r 开头并以 g 结尾

c - 如何等到窗口被映射和可见

linux - 如何让我的 dotnet 核心应用程序使用不同的包?

php - 将 IPTables 输出拆分为数据库的多维数组

linux - 用于计算不包括 # 的部分中的行数的脚本

linux - PHP 在实时环境中不显示错误,显示空白屏幕

sed - grep 或 sed 比较两个文件中的数据