使用仅以数字作为模式的Grep获取所需输出时出现问题

时间:2018-09-12 19:56:26

标签: linux awk grep

我正在尝试从文件2中复制与文件1中的值匹配的行,但输出会给出更多行。

文件1看起来像这样:

$ head b.txt
5
11
26
27

文件2 a.txt的样子

1509 5
1506 11
1507 12
339 26
1000 27
1000 100

我使用的命令:

grep -wFf b.txt a.txt

我想要的结果

1509 5
1506 11
339 26
1000 27

这给了我b.txt中所有的东西,但也有一些额外的行,例如

1509 5
1506 11
1507 12
339 26
1000 27
1000 100

我该如何解决?

2 个答案:

答案 0 :(得分:5)

我模拟了您的问题,并相信我知道发生了什么事。 b.txt末尾有一个空行,我得到的输出与您相同。如果我删除b.txt末尾的空行,则会得到所需的输出。

➜  ~ grep -wFf b.txt a.txt
1509 5
1506 11
339 26
1000 27

来自grep的联机帮助页:

  

-f file, --file=file                从文件中读取一个或多个换行符分隔的模式。 空的图案行与每个输入行匹配。换行符不视为图案的一部分。如果file为空,则没有任何内容                匹配。

我相信Empty pattern lines match every input line.是导致您错误输出的原因。

答案 1 :(得分:1)

也许您想加入文件。

join -12 -21 -o1.1,1.2 <(<a.txt sort -k2) <(<b.txt sort)

将输出:

1506 11
339 26
1000 27
1509 5

该命令将a.txt中的第二个字段与b.txt中的第二个字段连接在一起。 “ joins”表示在两个文件中查找具有相等值的指定字段。我将这两个文件“联接”到第一个文件的第二列和第二个文件的第一列上。 join需要根据连接的字段对输入进行排序,因此我们需要通过排序将其输入管道。遗憾的是,此方法无法保留文件中各行的顺序,因为需要重新排列它们才能使工作正常。