【发布时间】:2023-02-24 06:13:02
【问题描述】:
所以,我试图将几个.csv 文件合并到一个大文件中,但所有这些文件都有 csv-header。我已经创建了轻型 python 脚本,但它的运行速度太慢了。所以,我决定只使用 linux utils 来这样做(只是为了好玩和更好地了解它)。
- 首先,我将所有文件与
cat合并为一个文件(我不知道为什么,但less添加了一些奇怪的输出,例如我传递给他的文件的文件名):cat location/to/files/*.csv >> large_combined.csv- 然后,我注意到,每个
csv文件的标头都与每个文件的最后一条记录相连接,例如
zero,first,second,third 0,1,2,3 0,1,2,3 0,1,2,3zero,first,second,third 0,1,2,3- 我不想只替换所有标题,然后在修改后的文件的第一行添加一个,因为它太简单了,我想用一个
sed命令替换所有标题(只是为了更好地了解这个实用程序,因为如果它不是那么简单怎么办?添加标题不会帮助我完成其他类似的任务),所以我带来了这个regex,它会找到每个没有放在行首的标题(所以,基本上 - 每个标题,除了第一个)
(?<!^)(zero,first,second,third\b)- 然后简单地运行它:
sed -E "s/(?<!^)(zero,first,second,third\b)//g" large_combined.csv- 但是 bash 以某种方式决定在执行之前将
!^转换为-E,这样我的sed看起来像这样:
sed -E "s/(?<-E)(zero,first,second,third\b)//g" large_combined.csv sed: -e expression #1, char 280: Invalid preceding regular expression所以,我的问题是 -如何防止 bash 将
!^转换为-E?
附言
!^返回在当前或上一步给出的参数,因此它可以使任何其他程序崩溃,如下所示:ls -la ./!^ ls: cannot access './-la': No such file or directory而且这种行为非常烦人,尤其是对于任何使用
regex的程序 - 然后,我注意到,每个
【问题讨论】:
-
sed没有环顾四周。(?<按字面解释。First, I've combined all files in one with cat首先,对于每一个文件,不带第一行输出,然后cat。 -
得到类似
0,1,2,3zero,first,second,third和cat的东西意味着你的 CSV 文件末尾没有强制换行符 -
这不是我的 csv,也不是主要问题:)
-
您的 CSV 文件没有以换行符正确终止,正如处理文本文件的 POSIX 实用程序所期望的那样。 (根据定义,POSIX 文本文件是行的集合,其中一行定义为由换行符终止的字符串。文件的最后一行也不例外。)
-
如果您先修复 CSV 文件,剩下的就简单多了。