合并
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
但是遗憾的是当我使用这个命令时,我并没有得到预期的结果,合并的结果发生了“错位”,就像下图示例这样:
图1:paste命令结果示例
仔细查看图(1)可以发现,在合并的过程中给人的感觉是先换行然后才合并。“换行”让我想到了Windows
和Unix
在这一点上的不同点[1],这是在文本处理中要特别注意的问题。找到问题之后我便使用Notepad++
软件将行尾符从Windows(CRLF)
换成了Unix(LF)
。
图2:Notepad++转换示例
这样一来,合并文件的问题就解决了,但是总不能每个文件都用Notepadd++吧,我需要一种能够快速转换的工具,就这样我找到了另外两个命令:sed
和dos2unix
。
2 Shell command:sed
、dos2unix
(格式转换)
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
这部分主要说一点其他的内容。
- Windows Subsystem for Linux (WSL)
- 在不离开Windows的情况下访问Windows上的Linux终端,开发跨平台应用程序和管理IT基础架构。
- 编写脚本自动化任务,使用自己选择的Linux Shell
- How to Install Ubuntu on Windows Subsystem for Linux
- MATLAB文本操作
- dlmwrite函数,该函数可以在写入矩阵时设置行尾符(但是写入的不能是文本或者说字符串数据)
- readtable、writetable
Windows系统里面,每行结尾是"<回车><换行>",即"\r\n";在Unix系统下每行结尾只有"<换行>",即"\n";所以图1的结果就是多了一个换行,然后分隔符又是
tab
,所以就有了“错位”的结果;之所以最后一行看起来还可以是因为input1.txt
我没有输入Enter
键。 ↩︎