我正在研究第一个示例:Linux Journey
但是,在join file.txt file2.txt
之后我没有得到相同的输出
相反,我得到:
Doehn
Doene
Suery
我不知道发生了什么-自该网站发布以来,join命令的语法是否已更改?
答案 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的字段就会覆盖屏幕上已经存在的内容。