Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/amazon-s3/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Join 连接和粘贴命令_Join_Paste_Gnu Coreutils - Fatal编程技术网

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