根据第一列比较两个文件,打印一个文件的唯一部分

Posted

技术标签:

【中文标题】根据第一列比较两个文件,打印一个文件的唯一部分【英文标题】:Comparing two files based on 1st column, printing the unique part of one file 【发布时间】:2018-10-07 12:34:50 【问题描述】:

我有两个看起来像这样的文件:

文件1:

RYR2 29 70  0.376583106063  4.77084855376
MUC16 51 94 0.481067457376  3.9233164551
DCAF4L2 0 13    0.0691414496833 3.05307268261
USH2A 32 62 0.481792717087  2.81864194236
ZFHX4 14 37 0.371576262084  2.81030548752

文件2:

A26B2
RYR2
MUC16
ACTL9

我需要根据第一列比较它们并只打印第一个文件中不在第二列的那些行,所以输出应该是:

DCAF4L2 0 13    0.0691414496833 3.05307268261
USH2A 32 62 0.481792717087  2.81864194236
ZFHX4 14 37 0.371576262084  2.81030548752

我用 grep 试过了:

 grep -vFxf file2 file1

使用 awk:

awk 'NR==FNR exclude[$0];next !($0 in exclude)' file 2 file1

通讯:

comm -23 <(sort file1) <(sort file2)

没有用

【问题讨论】:

grep -vf file2 file1 适合我。检查您的文件是否有 DOS 行结尾。 @Cyrus 有效!非常感谢 您的 awk 非常接近:您只想查看 第一个单词 是否在数组中:!($1 in exclude)(当然删除“文件”和"2" 获取正确的文件) 对于你的 grep 命令,-x 选项在这里是不正确的:它指示 grep 将整行与模式进行比较。 【参考方案1】:

你可以使用

grep -vFf file2 file1

另外,grep -vf file2 file1 也可以工作,但如果file2 字符串包含应该作为文字字符读入的*[,你可能会遇到麻烦,因为它们应该被转义。 F 使 grep 将这些字符串视为固定字符串。

注意事项

-v:反转匹配。 -f file:从文件中获取正则表达式。 -F:将模式解释为固定字符串列表(而不是正则表达式),由换行符分隔,其中任何一个都将被匹配。

因此,它从file2 读取正则表达式并将它们应用于file1,一旦找到匹配项,由于反向搜索,该行不会输出。这已经足够了,因为只有第一列包含字母数字,其余的仅包含数字数据。

为什么你的命令不起作用

-x--line-regexp 的缩写)选项表示 Select only those matches that exactly match the whole line

另外,查看更多关于grep options in grep documentation的信息。

【讨论】:

以上是关于根据第一列比较两个文件,打印一个文件的唯一部分的主要内容,如果未能解决你的问题,请参考以下文章

比较基于第1列的两个文件,打印一个文件的唯一部分

根据第一列中的数据合并两个 CSV 文件

excel表格中如何让第一列始终显示并打印

比较两个文件,如果文件 1 中存在字符串,则打印 2,如果不存在则打印 1

根据第一列中数据的比较将数据从工作表复制到另一个工作表

用于将当前行与下一行进行比较并根据条件打印其中一行的 awk 解决方案