我有一个空格分隔文件(file1.csv
),我手动执行3个UNIX操作,即:
步骤1。从每行中删除所有双引号(“)。
sed 's/"//g' file1.csv > file_tmp1.csv
步骤2。删除任何行开头的所有空格。
sed 's/^ *//' file_tmp1.csv > file_tmp2.csv
步骤3。删除每行文本之间的所有其他空格。
cat file_tmp2.csv | tr -s " " > file1_processed.csv
所以,我想知道是否有更好的方法来实现这一点,以及在没有太多计算时间的情况下以Pythonic方式。使用UNIX命令完成后,这3个步骤大约需要5分钟(最长)。
请注意,文件file1.csv
是空格分隔文件,我希望它保持空格分隔。
此外,如果您的解决方案建议将整个file1.csv
加载到内存中,那么我会请求您建议以块的方式完成此操作,因为文件太大(约20 GB左右)无法加载到内存中每一次。
提前感谢。
答案 0 :(得分:2)
明显的改进是将tr
步骤转换为sed
并将所有部分合并为一个作业。首先是测试数据:
$ cat file
"this" "that"
工作:
$ sed 's/"//g;s/^ *//;s/ \+/ /g' file
this that
这里有一个awk中的所有步骤:
$ awk '{gsub(/\"|^ +/,""); gsub(/ +/," ")}1' file
this that
如果你测试它,请告诉我它花了多长时间。
答案 1 :(得分:0)
这是一个一次读取一行并执行您在Python中指定的替换的过程。
with open('file1.csv') as source:
for line in source:
print(' '.join(line.replace('"', '').split())
split()
的默认行为包括修剪任何前导(和尾随)空格,因此我们不会明确指定。如果您需要保留尾随空格,可能需要更新您的要求。
您的shell脚本尝试使用多个临时文件和sed
的多次调用都不是如何在shell中执行此操作的一个很好的示例。