ICode9

精准搜索请尝试: 精确搜索
首页 > 系统相关> 文章详细

linux – grep行存在于一个文件中但不存在于另一个文件中

2019-08-14 06:52:05  阅读:19  来源: 互联网

标签:linux grep sed command-line



我正在尝试使用简单的grep和grep -v,因此我将从b.txt中存在的a.txt中获取行,而不是在c.txt中.

3个文件的示例

A.TXT:

a
b
c
d
e

up.txt:

a.up
b.up
c.up

dw.txt:

a.dw
b.dw

期望的输出:

c

我编写了下面的代码,但grep一次看$(sed …)作为一行,而不是整体:

sed 's/.up//' /tmp/b.txt | grep -f /tmp/a.txt | grep -vf $(sed 's/.dw//' /tmp/c.txt)

解决方法:

假设文件都已排序,并且我们正在使用了解过程替换的shell(如bash):

$join -t . -v 1 -o 0 <( join -t . a.txt b.txt ) c.txt
c

或者,对于其他贝壳,

$join -t . a.txt b.txt | join -t . -v 1 -o 0 - c.txt
c

这使用连接两次来执行文件之间的关系连接.数据被解释为点分隔字段(使用-t.).

a.txt和b.txt之间的连接是直接的并且产生

a.up
b.up
c.up

这些是两个文件中的所有行,它们在两个文件中都出现了第一个以点分隔的字段.输出包括连接字段(a,b,c),后跟两个文件中的其他字段(仅b.txt具有任何其他数据).

第二次加入有点特别.使用-v 1,我们要求查看第一个文件中的条目(上面的中间结果),这些条目不能与第二个文件c.txt中的任何行配对.另外,我们只要求查看连接字段本身(-o 0).如果没有-o标志,我们会得到c.up作为结果.

如果文件未排序,则文件名文件的每次出现都可以用命令中的<(排序文件)替换.



标签:linux,grep,sed,command-line

专注分享技术,共同学习,共同进步。

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有