为什么这个Linux命令的结果没有通过管道传输?

为什么这个Linux命令的结果没有通过管道传输?,linux,terminal,Linux,Terminal,我正在学习使用Linux终端,但管道似乎并不像我预期的那样工作,我想了解原因 我有两个文件: 文件1 文件2 我的想法是对File2进行排序,然后使用以下命令将排序结果与File1连接起来: sort -k2n File2 | join -1 2 -2 2 File1 File2 结果我预料到了 2 John Paul 5 Francis Henry 但它似乎并没有在配管和退货之前订购: 2 John Paul join: File2:3: is not ordered: Francis

我正在学习使用Linux终端,但管道似乎并不像我预期的那样工作,我想了解原因

我有两个文件:

文件1

文件2

我的想法是对File2进行排序,然后使用以下命令将排序结果与File1连接起来:

sort -k2n File2 | join -1 2 -2 2 File1 File2
结果我预料到了

2 John Paul 
5 Francis Henry 
但它似乎并没有在配管和退货之前订购:

2 John Paul
join: File2:3: is not ordered: Francis 5

为什么它没有管道化我的排序???

排序文件2
对文件2没有任何作用,它将排序后的内容写入标准输出(我想这是您所期望的,因为您使用的是管道)

连接文件1文件2
忽略标准输入(即管道),并对指定文件中的数据进行操作。特别是,文件2没有排序


您可能希望在join命令中编写
-
而不是
file2
-
表示从标准输入读取。

排序命令不从标准输入读取,因此联接不考虑对文件2的排序

您的解决方案应该如下所示:

$ sort -k2n File2 | join -1 2 -2 2 File1 -

2 Paul John
5 Henry Francis
2 John Paul
join: File2:3: is not ordered: Francis 5
$ sort -k2n File2 | join -1 2 -2 2 File1 -

2 Paul John
5 Henry Francis