Join 连接和粘贴命令
我有两个文件Join 连接和粘贴命令,join,paste,gnu-coreutils,Join,Paste,Gnu Coreutils,我有两个文件 bash-3.2$ cat result2.txt HOSTNAME=host4 2 HOSTNAME=host1 2 HOSTNAME=host6 1 HOSTNAME=host3 1 HOSTNAME=host2 1 bash-3.2$ cat result1.txt HOSTNAME=host1 2 HOSTNAME=host2 1 bash-3.2$ cat result.txt HOSTNAME=host1 2 HOSTNAME=host2 1 H
bash-3.2$ cat result2.txt
HOSTNAME=host4 2
HOSTNAME=host1 2
HOSTNAME=host6 1
HOSTNAME=host3 1
HOSTNAME=host2 1
bash-3.2$ cat result1.txt
HOSTNAME=host1 2
HOSTNAME=host2 1
bash-3.2$ cat result.txt
HOSTNAME=host1 2
HOSTNAME=host2 1
HOSTNAME=host3 1
bash-3.2$ cat result3.txt
HOSTNAME=host4 3
HOSTNAME=host1 4
HOSTNAME=host3 7
HOSTNAME=host2 8
HOSTNAME=host6 6
bash-3.2$ join -1 1 -2 1 -a 1 -a 1 result2.txt result1.txt
HOSTNAME=host4 2
HOSTNAME=host1 2
HOSTNAME=host6 1
HOSTNAME=host3 1
HOSTNAME=host2 1
当两个文件的第1列的顺序和值不相同时,我想加入2个文件
我希望输出是
hostname result result1 result2 result3
HOSTNAME=host1 2 2 2 4
HOSTNAME=host2 1 1 1 8
HOSTNAME=host3 1 0 1 7
HOSTNAME=host4 0 0 2 3
HOSTNAME=host6 0 0 1 6
即使“粘贴”命令也不起作用,因为它假定两个文件的第一列相同。或者bash中是否有其他命令可用于此输出这是第一个需求的解决方案,只有两个文件。有关多个文件的解决方案,请选中!
使用awk
进行此操作如何?只需将第二个文件(result1.txt)中的数据存储在数组中,然后在读取第一个文件(result2.txt)时进行相应的打印即可:
如果您需要对其进行排序,请转到
sort
:awk'…'f2 f1 | sort
或说awk'…'f2更新:在我已经回答了问题之后,您对问题进行了重大更改。现在你说你有4个文件而不是2个
但是,基本逻辑保持不变,我们只需要使用上一次连接操作的结果再次连接:
join -o auto -j1 -a1 -a2 -e0 \
<(join -o auto -j1 -a 1 -a 2 -e 0 \
<(join -o auto -j 1 -a 1 -a 2 -e 0 \
<(sort r1.txt) <(sort r0.txt)) <(sort r2.txt)) <(sort r3.txt)
您正在查找以下命令:
join -o '1.1 1.2 2.2' -j 1 -a 1 -a 2 -e 0 <(sort r2.txt) <(sort r1.txt)
说明:
-j1
与-11-21
相同(您有)。它的意思是“通过两个文件中的字段1连接”
-a1-a2
打印文件1和文件2中不可连接的行
-e0
使用0
作为空列的默认值
谢谢。。如果我有多个文件要加入到一个输出文件中,..@PrMeAsAr,那么您需要编辑原始问题,提供一个。为了防止出现这种情况,您可能需要检查并注意,如果答案解决了您的问题(在8个问题之后您还没有这样做!),并且传递给awk命令的文件顺序是否重要bash-3.2$awk'FNR==NR{data[$1]=2;next}{print$0,($1 in data)→data[$1]:0}'result2.txt result1.txt HOSTNAME=host1 2 HOSTNAME=host2 11@PrMeAsAr是的,您必须提供result2.txt
作为第二个参数,因为它是用于打印全文的参数。@PrMeAsAr正如我前面所说,您需要编辑您的问题来解释这一点。不要完全更新,直到你确定你的问题完全传达了你的需求,因为我们不会在每次更新后继续更新答案:)很好!不过请注意,这个要求涉及更多文件,更为复杂。@fedorqui啊,我明白了。依定义,联接操作只能包含2个结果集。我遗漏了什么吗?嗯,你可以使用进程替换,然后说join@fedorqui是的,这是可以做到的。但是,-o
参数在每次调用join
时都需要更改,除非可以使用-o auto
。请不要在注释中发布文件内容。我假设它们与问题中的相同——在行尾没有空格(也没有额外的换行符)。既然您有bash-3.2,我假设您运行的是MaxOS。您可以尝试安装GNU(!)coreutils吗?
HOSTNAME=host1 2 2 2 4
HOSTNAME=host2 1 1 1 8
HOSTNAME=host3 0 1 1 7
HOSTNAME=host4 0 0 2 3
HOSTNAME=host6 0 0 1 6
join -o '1.1 1.2 2.2' -j 1 -a 1 -a 2 -e 0 <(sort r2.txt) <(sort r1.txt)
HOSTNAME=host1 2 2
HOSTNAME=host2 1 1
HOSTNAME=host3 1 0
HOSTNAME=host4 2 0
HOSTNAME=host6 1 0