【问题标题】:Differences between Unix commands for Sorting CSV用于排序 CSV 的 Unix 命令之间的差异
【发布时间】:2016-01-29 16:34:48
【问题描述】:

两者有什么区别:

!tail -n +2 hits.csv | sort -k 1n -o output.csv

!tail -n +2 hits.csv | sort -t "," -k1 -n -k2 > output.csv

? 我正在尝试先按第一列,然后按第二列对 csv 文件进行排序,以便具有相同第一列的行仍然在一起。

似乎第一个已经正确地做到了,首先按第一个逗号之前的字段排序,然后按第一个逗号后面的字段排序。 (即断绝关系。)

或者它实际上并没有这样做?

第二个命令的作用/含义是什么? (以及两者有什么区别?)当我运行这两个时,两个 output.csv 文件之间存在显着差异。

最后,我应该使用哪一个? (或者他们都错了?)

【问题讨论】:

    标签: linux sorting csv unix


    【解决方案1】:

    另请参阅@morido 的答案以获得其他一些指针,但这里是对这两个 sort 调用的确切作用的描述:

    sort -k 1n -o output.csv
    

    这假定文件中的“字段”由从非空白到空白的过渡分隔(即,前导空白包含在每个字段中,而不是像许多人期望/假设的那样被剥离),并告诉sort通过从第一个字段开始并延伸到行尾的键对事物进行排序,并假定键被格式化为数值。输出显式发送到特定文件。

    sort -t "," -k1 -n -k2
    

    这将字段分隔符定义为逗号,然后定义两个要排序的键。第一个键再次从第一个字段开始并延伸到行尾,并且是字典顺序(字典顺序),而不是数字,第二个键将在第一个键的值相同时使用,从第二个键开始字段并延伸到行尾,并且由于介入-n,也将被假定为数字数据。但是,由于您的第一个键需要整行,因此基本上可能永远不需要第二个键(如果两个单独行的第一个键相同,则第二个键很可能也是)。

    由于您没有提供示例数据,因此不知道前两个字段中的数据是否为数字,但我怀疑您想要类似于@morido 答案中建议的内容:

    sort -t, -k1,1 -k2,2
    

    sort -t, -k1,1n -k2,2n          (alternatively sort -t, -n -k1,1 -k2,2)
    

    如果数据是数字。

    【讨论】:

    • 这是我的 hits.csv:
    • ip,timestamp 62.172.72.131,1041502001 62.172.72.131,1041502098 62.121.107.115,1041809792 163.28.16.1,1043258352 216.37.59.126,1044304131 68.104.188.224,1044472900 66.137.118.69,1044543502 207.181.42.20, 1044646708 205.156.184.254,1045670100 80.225.248.61,1045779615 200.44.24.157,1046214366 193.63.247.68,1046260886 66.176.248.72,1046317786 216.249.85.109,1046566502 68.44.222.12,1046638290 130.113.69.66,1048009156
    • @ajfbiw.s 呃。您能否编辑您的答案而不是在 cmets 中发布该示例数据?我几乎无法破译这个......
    • 排序 -t, -k1,1 -k2,2n
    【解决方案2】:

    首先:您想从这两个命令中删除前导 !。在 Bash 中(可能还有其他人,因为这来自 csh),否则您将引用历史记录中包含 tail 的最后一个命令,这在此处没有意义。


    您的两个版本之间的主要区别在于,在第一种情况下,您没有考虑第二列。

    我会这样做:

    tail -n +2 hits.csv | sort -t "," -n --key=1,1 --key=2,2 > output.csv
    
    • -t 指定字段分隔符
    • -n 开启数字排序
    • --key 指定应该用于排序的字段(按优先顺序)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-12-20
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多