我有两个看起来像这样的文件:
文件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
字符串包含应以文字字符形式读取的*
或[
,则可能会遇到麻烦,因为应将其转义。 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的更多信息。关于awk - 根据第一列比较两个文件,打印一个文件的唯一部分,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/50049271/