Unix join命令(在Windows上) - 回车符/换行符不一致

时间:2015-02-06 02:38:51

标签: unix join

试图在Windows(unxutils)下使用Unix join命令,我得到了奇怪的结果。

输入文件是File_1.txt和File_2.txt。这些文件中的每一行都以标准Windows CR / LF结束。

File_1.txt

Path,CurrentFileCount1,CurrentFileSize1,FileCount1 **CRLF**
"c:\program files\Common Files\System\ado",1,2,3 **CRLF**
"c:\program files\Common Files\System\en-US",11,22,33 **CRLF**
"c:\program files\Common Files\System\msadc\en-US",111,222,333 **CRLF**
"c:\program files\Common Files\System\msadc",1111,2222,3333

File_2.txt

Path,CurrentFileCount2,CurrentFileSize2,FileCount2 **CRLF**
"c:\program files\Common Files\System\ado",4,5,6 **CRLF**
"c:\program files\Common Files\System\en-US",44,55,66 **CRLF**
"c:\program files\Common Files\System\msadc\en-US",444,555,666 **CRLF**
"c:\program files\Common Files\System\msadc",4444,5555,6666

每个文件有4个字段,我正在加入每个文件的第一个字段。

使用-o参数我省略了每个文件中的最后一个字段,结果与每行后的CR / LF一样正常。

Files_joined_3_fields.txt

Path,CurrentFileCount1,CurrentFileSize1,CurrentFileCount2,CurrentFileSize2 **CRLF**
"c:\program files\Common Files\System\ado",1,2,4,5 **CRLF**
"c:\program files\Common Files\System\en-US",11,22,44,55 **CRLF**
"c:\program files\Common Files\System\msadc\en-US",111,222,444,555 **CRLF**
"c:\program files\Common Files\System\msadc",1111,2222,4444,5555 **CRLF**

但是,如果我包含来自任一文件的所有4个字段或来自两个文件的所有4个字段,我将在第4个字段后获得单个CR。

Files_joined_4_fields_left.txt

Path,CurrentFileCount1,CurrentFileSize1,FileCount1 **CR**
,CurrentFileCount2,CurrentFileSize2 **CRLF**
"c:\program files\Common Files\System\ado",1,2,3 **CR**
,4,5 **CRLF**
"c:\program files\Common Files\System\en-US",11,22,33 **CR**
,44,55 **CRLF**
"c:\program files\Common Files\System\msadc\en-US",111,222,333 **CR**
,444,555 **CRLF**
"c:\program files\Common Files\System\msadc",1111,2222,3333,4444,555 **CRLF**

Files_joined_4_fields_right.txt

Path,CurrentFileCount1,CurrentFileSize1,CurrentFileCount2,CurrentFileSize2,FileCount2 **CR**
**CRLF**
"c:\program files\Common Files\System\ado",1,2,4,5,6 **CR**
**CRLF**
"c:\program files\Common Files\System\en-US",11,22,44,55,66 **CR**
**CRLF**
"c:\program files\Common Files\System\msadc\en-US",111,222,444,555,666 **CR**
**CRLF**
"c:\program files\Common Files\System\msadc",1111,2222,4444,5555,6666 **CRLF**

Files_joined_4_fields_both.txt

Path,CurrentFileCount1,CurrentFileSize1,FileCount1 **CR**
,CurrentFileCount2,CurrentFileSize2,FileCount2 **CR**
**CRLF**
"c:\program files\Common Files\System\ado",1,2,3 **CR**
,4,5,6 **CR**
**CRLF**
"c:\program files\Common Files\System\en-US",11,22,33 **CR**
,44,55,66 **CR**
**CRLF**
"c:\program files\Common Files\System\msadc\en-US",111,222,333 **CR**
,444,555,666 **CR**
**CRLF**
"c:\program files\Common Files\System\msadc",1111,2222,3333,4444,5555,6666 **CRLF**

如果我不使用包含所有字段的-o参数,则会发生同样的事情。结果与 Files_joined_4_fields_both.txt

中显示的结果相同

我知道我可以使用sed来摆脱这些无关的CR,但我很好奇他们为什么会在场。

1 个答案:

答案 0 :(得分:0)

  

我知道我可以使用sed来摆脱这些无关的CR,但我是   好奇他们为什么在场。

显然这个版本的join并不尊重Windows行结束约定的输入;它将CR视为最后一个字段的一部分,因此无论在输出中出现一行的最后一个字段,它都将CR作为其最后一个字符。