Sorting 使用unix实用程序排序对csv文件进行排序
有没有一种方法可以使用sort对非常大的CSV文件进行排序?Sorting 使用unix实用程序排序对csv文件进行排序,sorting,csv,Sorting,Csv,有没有一种方法可以使用sort对非常大的CSV文件进行排序? 不过,只需按第一列进行排序,数据可能会在一列中包含换行符。标准CSV文件规则适用。换行符会破坏排序实用程序吗?我认为您应该尝试类似于此cat old.csv | sort>new.csv的内容 UPD:如果需要,为了准备数据,我们可以使用AWK脚本……排序功能将按图像顺序对行进行排序。为了获得更复杂的效果,您可以使用UNIX实用程序awk。您可以混合使用多种实用程序。希望我能正确地理解它。。。如果是这样的话,这可能会起作用。如果没有,
不过,只需按第一列进行排序,数据可能会在一列中包含换行符。标准CSV文件规则适用。换行符会破坏排序实用程序吗?我认为您应该尝试类似于此cat old.csv | sort>new.csv的内容
UPD:如果需要,为了准备数据,我们可以使用AWK脚本……排序功能将按图像顺序对行进行排序。为了获得更复杂的效果,您可以使用UNIX实用程序awk。您可以混合使用多种实用程序。希望我能正确地理解它。。。如果是这样的话,这可能会起作用。如果没有,请指出我在假设中出错的地方:-这要求每个CSV记录的字段数是固定的。这也是一个非常简单的示例,没有涵盖各种CSV变量,例如,hello,world,how,are,you will break as world,how,are,you will will,将如何拆分为两个字段:
hello,world,how,are,you
one,two,three,four,five
once,I,caught,a
fish,alive
hey,now,hey,now,now
这个awk脚本:
BEGIN {
FS=","
fields=0
}
{
if (line == "") {
fields=NF
line = $0
} else {
fields=fields + (NF - 1)
line=line"|"$0
}
}
fields == 5 {
print line
fields = 0
line = ""
}
执行此命令:
awk -f join.awk < infile | sort | tr '|' '\n'
本质上,我们使用awk脚本所做的一切就是将多行记录合并成一行,然后我们可以对其进行排序,然后使用tr再次中断。我使用管道替换换行符-只需选择一些可以保证不会出现在CSV记录中的内容
现在它可能不适合你想要的东西,但希望它能把你推向正确的方向。我编写的awk脚本的主要内容是,它需要知道每个CSV记录有多少字段。这需要修正。如果它是可变的,那么所有的赌注都是无效的,因为需要更多的规则来定义要排序的文件的语义性质…更简单的方法是临时修改数据,以便标准的UNIX排序命令可以正确地解释数据 您可以使用一个名为csvquote的程序,该程序将带引号的字段值中有问题的逗号和换行符替换为非打印字符。然后,它会在管道的末尾恢复这些字符 比如说,
csvquote inputfile.csv | sort | csvquote -u
您可以在这里找到代码:实际上相当困难。您可能想看看我的自由/开源软件项目,该项目在Unix上运行CSV文件排序等功能。@Neil Bufferworth:酷!它是否适用于列数据中有换行符的大型csv文件?csvfix在1000万行上的性能如何?@user我猜不太好,排序是在内存中执行的。我没有在大量输入上测试过它。@Neil Butterworth:如果它只在内存中排序,而没有从磁盘进行合并排序,那么它对大型输入不起作用,对吗?请正确阅读问题。数据可能包含换行符使用AWK脚本准备数据非常简单,这正是为了准备格式化大型日志文件,我没有说这个命令会起作用,我很难过smth是这样的。。。
csvquote inputfile.csv | sort | csvquote -u