批量"左右"合并txt文件

  合并txt文件有很多种方法,如果文件数目不多手动复制也不是不可,但是文件多的时候就显得有点力不从心了;有的时候不光如此,每个文件的内容排列顺序还不一样,分隔符也不一样🙃,没错我正是遇见了这么多的问题所以“费尽心机”找到了办法,这个过程中我也学习到了一些东西,故在这里记录下来......

1 Shell command:paste (合并文件)

  为了批量“左右”合并txt文件,我找到了一个Shell命令paste,其详细用法可以在菜鸟教程👈获取,概括示例如下:

# (当你在Windows中使用shell命令时,需要加上文件后缀,unix系统则可以自动识别,下同)
# 将input和input文件列对列(“左右”)合并到文件output,这里均指定分隔符为'tab'
paste   -d'\t'  input1.txt  input2.txt>output.txt    
# 快速将文件夹内所有合并到output.txt
paste   -d'\t'   *>output.txt  

  但是遗憾的是当我使用这个命令时,我并没有得到预期的结果,合并的结果发生了“错位”,就像下图示例这样:

tnLlY6.png

图1:paste命令结果示例

  仔细查看图(1)可以发现,在合并的过程中给人的感觉是先换行然后才合并。“换行”让我想到了WindowsUnix在这一点上的不同点[1],这是在文本处理中要特别注意的问题。找到问题之后我便使用Notepad++软件将行尾符从Windows(CRLF)换成了Unix(LF)

tnLlY6.png

图2:Notepad++转换示例

  这样一来,合并文件的问题就解决了,但是总不能每个文件都用Notepadd++吧,我需要一种能够快速转换的工具,就这样我找到了另外两个命令:seddos2unix

2 Shell command:seddos2unix (格式转换)

2.1 sed

  Unix中的SED命令代表流编辑器,它可以对文件执行很多功能,例如搜索,查找和替换,插入或删除,Unix中的SED命令支持正则表达式,从而可以执行复杂的模式匹配,更多了解在这里👈。

  我在stack overflow上找到了更改行尾符的具体代码,示例如下:

# 单个文件转换
sed -i 's/\r//g' file.txt
# 正则匹配所有的txt文件
sed -i 's/\r//g' *.txt

2.2 dos2unix

  dos2unix:DOS / MAC至UNIX文本文件格式转换器,可惜的是Ubuntu上没有这个命令(可能是因为它不属于unix标准),所以需要自己安装,因此建议直接用sed命令,方便快捷。但是如果对dos2unix感兴趣的话,可以在这里或者这里了解更多信息,同时它们也提供了安装包。

3. Others

这部分主要说一点其他的内容。

  1. Windows Subsystem for Linux (WSL)
  2. MATLAB文本操作
    • dlmwrite函数,该函数可以在写入矩阵时设置行尾符(但是写入的不能是文本或者说字符串数据)
    • readtable、writetable

  1. Windows系统里面,每行结尾是"<回车><换行>",即"\r\n";在Unix系统下每行结尾只有"<换行>",即"\n";所以图1的结果就是多了一个换行,然后分隔符又是tab,所以就有了“错位”的结果;之所以最后一行看起来还可以是因为input1.txt我没有输入Enter键。 ↩︎