如何修复 unix `join` 命令在连接列之间插入 ^M ? -Unix

如何修复 unix `join` 命令在连接列之间插入 ^M ? -Unix

我是一名新手程序员。我正在使用 unix 的join命令将几个长文件自连接在一起。

join -j30 test test2
col1 col2 ... col30    col1 col2 ... col30
A    B        ZZZ   ^M A    B        ZZZ

^M我在输出中得到这个字符。

为什么它在那里?以及我该如何删除它?

编辑:下面是我的输出部分的屏幕截图

在此输入图像描述

答案1

^M 表示您正在 Windows 中引入/编辑文件。

dos2unix对文件使用命令将它们转换为 Unix 文本模式。

DOS 使用回车和换行符“\r\n”作为行结束符,而 Unix 仅使用换行符“\n”。 ^M 是“额外”\r 字符的视觉表示。

要安装该dos2unix命令,请执行以下操作(在基于 Debian 的发行版上):

sudo apt-get install dos2unix

或在 Mac (MacPorts) 中:

sudo port install dos2unix

或者,您也可以使用 sed 来执行此操作,如下所示:

sed 's/\r$//' dosfile.txt > unixfile.txt

答案2

join(1)(至少我正在使用的版本)不会^M向连接的文件添加或回车;join但会很乐意复制^M。十六进制查看器加上一些测试用例可以显示正在发生的情况:

$ echo "1 a" > test1
$ echo "1 b" > test2
$ join test1 test2 | od -bc
0000000   061 040 141 040 142 012                                        
           1       a       b  \n                                        
0000006
$

^M以及输入文件中有一个测试用例:

$ perl -E "say qq(1 a\r)" > test1
$ perl -E "say qq(1 b\r)" > test2
$ join test1 test2 | od -bc
0000000   061 040 141 015 040 142 015 012                                
           1       a  \r       b  \r  \n                                
0000010
$ 

有多种方法可以纠正输入文件,此外dos2unix还可以使用一种方法tr(尽管如果文件使用古老的 MacOS 传统\r作为行分隔符,这将是一个糟糕的主意):

$ od -bc test1
0000000   061 040 141 015 012                                            
           1       a  \r  \n                                            
0000005
$ tr -d '\r' < test1 > foo
$ mv foo test1
$ od -bc test1            
0000000   061 040 141 012                                                
           1       a  \n                                                
0000004
$ 

相关内容