我正在处理这里的第一个示例:Linux Journey
但是,在 join file.txt file2.txt
相反,我得到:
Doehn
Doene
Suery
我无法弄清楚发生了什么 - 自该网站发布以来加入命令语法是否发生了变化?
最佳答案
我的 Crystal 球说你的文本文件是 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
输出公共(public)字段,一个空格,文件 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 中的字段会覆盖屏幕上已有的内容。
关于Linux "join"命令无法正常工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56365917/