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



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

排序函数将按ASCII顺序对行进行排序。为了获得更复杂的效果,您可以使用UNIX实用程序awk。

我认为您应该尝试类似cat old.csv | sort > new.csv 的东西

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

您可以使用多种实用程序来完成此操作。希望我能正确理解。。。如果是这样的话,这可能会起到作用。如果不是,请指出我在一个假设中出错的地方:-)这需要每个CSV记录的字段数是固定的(这也是一个非常简单的例子,它没有涵盖各种CSV变体(例如,你好,"世界,如何",are,你会把"世界,怎样"分解为两个字段):

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记录有多少字段。这需要解决。如果它是可变的,那么所有的赌注都是无效的,因为需要有更多的规则来定义你想要排序的文件的语义性质…

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

您可以使用一个名为csvquote的程序,该程序将带引号的字段值中有问题的逗号和换行符替换为非打印字符。然后,它将恢复管道末端的那些字符。

例如,

csvquote inputfile.csv | sort | csvquote -u

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

最新更新