Linux的“ join”命令不能正常工作吗?

时间:2019-05-29 17:40:10

标签: linux command-line

我正在研究第一个示例:Linux Journey

但是,在join file.txt file2.txt之后我没有得到相同的输出

相反,我得到:

 Doehn

 Doene

 Suery

我不知道发生了什么-自该网站发布以来,join命令的语法是否已更改?

1 个答案:

答案 0 :(得分:2)

我的水晶球说您的文本文件是DOS格式,带有回车换行符(CR LF)的行尾。这就是为什么在控制台上打印输出时看起来有点奇怪的原因。

要修复此问题,请将文件转换为Unix格式。 (您可能有一个dos2unix命令;或者如果您已经在使用vim,请尝试:set ff=unix;或者perl -i -pe 's/\r//' file.txt会在一定程度上起作用。)


链接中包含额外回车符的示例文件为:

file1.txt

1 John\r
2 Jane\r
3 Mary\r

file2.txt

1 Doe\r
2 Doe\r
3 Sue\r

(使用\r代表回车。)

现在,当您运行join file1.txt file2.txt时,它将首先比较每个文件中第一行的第一字段。这样就成功了(两边1),所以join输出一个公共字段,一个空格,文件1的其余字段,另一个空格,然后文件2的其余字段。因此,第一行输出是

1 John\r Doe\r

({\r被解释为字段数据的一部分)。

但是等等! \r不是可打印字符。当打印到终端时,具有将光标移回行首的效果。使用^标记光标位置,我们得到以下效果:

1
 ^
1 
  ^
1 J
   ^
1 Jo
    ^
1 Joh
     ^
1 John
      ^

我们在这里打印出第一个回车符,将光标移回:

1 John
^

下一个输出字符(空格)将覆盖1

  John
 ^
 DJohn
  ^
 Doohn
   ^
 Doehn
    ^

另一回车,但此回车没有可见效果:

 Doehn
^

然后...完成。

其他行的处理方式相同。每当文件1的最后一个字段末尾的回车将光标移回时,文件2的字段就会覆盖屏幕上已经存在的内容。