我必须做与 相反的事情join -v1 fileA fileB
,它说:打印 fileA 中的第一个字段与 fileB 中任何行的第一个字段不匹配的行。相反,我想写 fileA 中的行做(在第一个字段上)与 fileB 中的行一致。
我尝试过 make join -o 1.1 2.1 fileA fileB
,但这会重复重合的行,而不是写入第一个文件的行(如果相同)。
最简单的方法是什么?
答案1
饰演 佐藤桂评论了,你可以“欺骗” join 只看到 fileB 中的字段 1,然后要求它进行正常的 join;这会打印 fileA 中的行以及(被欺骗的)fileB 中该行的(空)剩余部分:
join fileA <(awk '{print $1}' fileB)
给定输入文件:
$ cat fileA
1 blah
2 foo
3 bar
$ cat fileB
3 barely
4 baz
5 qux
结果输出是:
$ join fileA <(awk '{print $1}' fileB)
3 bar
通配符指出你可以更直接地做到这一点(避免进程替换),通过将 awk 的输出管道到join
:
awk '{print $1}' fileB | join fileA -
答案2
如果这两个文件已排序,您可以像这样使用来显示不在其中的comm
行:fileA
fileB
comm -23 fileA fileB
fileB
或者您是否也想要不在其中的行fileA
?