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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了比较基于第1列的两个文件,打印一个文件的唯一部分相关的知识,希望对你有一定的参考价值。

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

菲尔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 -vFf file2 file1

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

笔记

  • -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列的两个文件,打印一个文件的唯一部分的主要内容,如果未能解决你的问题,请参考以下文章

两个文件中的AWK列匹配,打印不同的列

两个文件diff:交集差集并集

Python:基于两个特征的独特组合和第三个特征的条件删除重复项

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

Unix命令查找两个文件中常见的行

Perl:匹配两个文件中的数据