【问题标题】:sort csv file using unix utililty sort使用 unix utililty sort 对 csv 文件进行排序
【发布时间】:2011-06-07 18:38:03
【问题描述】:

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

【问题讨论】:

  • 其实挺难的。您可能想看看我在code.google.com/p/csvfix 的 FOSS 项目,它可以对 CSV 文件进行排序等等,并在 Unix 上运行。
  • @Neil Bufferworth:酷!它适用于列数据中包含换行符的大型 csv 文件吗?
  • 那么 csvfix 在 1000 万行上的表现如何?
  • @user 我猜不太好,排序是在内存中执行的。我还没有在大量输入上对其进行测试。
  • @Neil Butterworth:如果它只在内存中排序而不从磁盘进行合并排序,那么它不适用于大型输入,对吧?

标签: sorting csv


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

    • 正确阅读问题。 “数据可能包含换行符”
    • 使用 AWK 脚本准备数据非常简单,它正是用于准备(格式化)巨大的日志文件))我没有说这个命令会起作用,我很伤心这样...... .
    【解决方案3】:

    您可以使用多种实用程序来做到这一点。希望我理解正确......如果是这样,这可能会起作用。如果不是,请指出我在假设中出错的地方:-) 这要求每个 CSV 记录的字段数是固定的(这也是一个简单的示例,不涵盖各种 CSV 变体(例如,你好,” world,how",are, are, you would break as "world,how" 将分为两个字段)):

    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 记录有多少个字段。这需要修复。如果它是可变的,那么所有的赌注都被取消了,因为那里需要更多的规则来定义你想要排序的文件的语义性质......

    【讨论】:

      【解决方案4】:

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

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

      例如,

      csvquote inputfile.csv | sort | csvquote -u
      

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

      【讨论】:

        猜你喜欢
        • 2023-04-04
        • 2018-11-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-11-03
        • 1970-01-01
        相关资源
        最近更新 更多