我正在尝试从文件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
我该如何解决?
答案 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
需要根据连接的字段对输入进行排序,因此我们需要通过排序将其输入管道。遗憾的是,此方法无法保留文件中各行的顺序,因为需要重新排列它们才能使工作正常。