Linux "join"命令无法正常工作?

标签 linux command-line

我正在处理这里的第一个示例: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/

相关文章:

linux - 创建一个参数以在linux中查找以特定字母开头的文件

mysql - 如何获取服务器上未找到/未保存的所有 ImageField 的列表?

linux - 如何关闭 Net::LDAP::Server

command-line - 直接从 url 启动 groovy 脚本

windows - 如何在 Visual Studio 中嵌入命令 shell

linux - 通过正则表达式重命名文件夹中的所有文件

linux - 在脚本中使用 ssh 执行 passwd 命令后没有返回

powershell - 使用 Select-String 检查 powershell 中的两个 .txt 文件

linux - 如何解析已使用不同区域设置格式化的日期

具有选项的命令行参数