使用unix实用程序排序对csv文件进行排序

时间:2011-06-07 18:38:04

标签: sorting csv

有没有办法使用sort对非常大的CSV文件进行排序? 但是,只需按第一列排序,数据可能包含列中的换行符(适用标准CSV文件规则)。换行会破坏sort实用程序吗?

4 个答案:

答案 0 :(得分:0)

我相信你应该尝试这样的事情cat old.csv | sort > new.csv

UPD:如果需要,我们可以使用AWK脚本准备数据....

答案 1 :(得分:0)

sort函数将按照asciicographical顺序对行进行排序。要获得更复杂的效果,可以使用UNIX实用程序awk。

答案 2 :(得分:0)

你可以使用各种实用程序来完成它。希望我能正确地理解它......如果是这样的话,这可能会起到作用。如果没有,请指出我在假设中出错的地方:-)这要求每个CSV记录的字段数是固定的(这也是一个简单的例子,不包括各种CSV变体(例如,你好),世界,“你是如何打破世界,如何”将分为两个领域)):

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'

给出了这个输出:

hello,world,how,are,you
hey,now,hey,now,now
once,I,caught,a
fish,alive
one,two,three,four,five

从本质上讲,我们对awk脚本所做的就是将多行记录合并为单行,然后我们可以将其输入sort,然后再次使用tr。我正在使用管道作为换行符的替代品 - 只需选择一些您可以保证不会出现在CSV记录中的内容。

现在它可能不适合你想要的东西,但希望它会把你推向正确的方向。我敲掉的awk脚本的主要内容是它需要知道每条CSV记录有多少字段。这需要修复。如果它是变量,那么所有的赌注都是关闭的,因为需要有更多的规则来定义你想要排序的文件的语义性质......

答案 3 :(得分:0)

更简单的方法是临时修改数据,以便标准UNIX排序命令可以正确解释您的数据。

您可以使用名为csvquote的程序,该程序使用非打印字符替换带引号字段值内的有问题的逗号和换行符。然后它会在管道的末尾恢复这些字符。

例如,

csvquote inputfile.csv | sort | csvquote -u

您可以在此处找到代码:https://github.com/dbro/csvquote