【问题标题】:How do I sort a CSV file by a specific column?如何按特定列对 CSV 文件进行排序?
【发布时间】:2016-01-15 10:52:48
【问题描述】:

我想对csv进行如下排序,我想要的是

  1. 按第 2 列排序
  2. 如果列相同,则按第 3 列排序(数字)

这是我的工作:

$ sort  -t","  -k2 -nk3  /tmp/test.csv
55b64670abb9c0663e77de84,525e3bfad07b4377dc142a24:9999,0.081032
5510b33ec720d80086865312,525e3bfad07b4377dc142a24:9999,0.081033
55aca6a1d2e33dc888ddeb31,525e3bf7d07b4377d31429d2:2,0.081034
55aca6a1d2e33dc888ddeb31,525e3bf7d07b4377d31429d2:2,0.081034
5514548ec720d80086bfec46,525e3bfad07b4377dc142a24:9999,0.081035
551d4e21c720d80086084f45,525e3bfad07b4377dc142a24:9999,0.081036
557bff5276bd54a8df83268a,525e3bfad07b4377dc142a24:9999,0.081036

这个结果很奇怪,先按第三列,再按第二列

【问题讨论】:

标签: linux sorting csv


【解决方案1】:

这个命令似乎产生了正确的输出:

sort -t"," -k2,2 -k3,3n /tmp/test.csv

我使用逗号仅将顺序限制到该列,并使用数字 (-n) 切换到第三列中的最后一个字符。

它产生:

55aca6a1d2e33dc888ddeb31,525e3bf7d07b4377d31429d2:2,0.081034
55aca6a1d2e33dc888ddeb31,525e3bf7d07b4377d31429d2:2,0.081034
55b64670abb9c0663e77de84,525e3bfad07b4377dc142a24:9999,0.081032
5510b33ec720d80086865312,525e3bfad07b4377dc142a24:9999,0.081033
5514548ec720d80086bfec46,525e3bfad07b4377dc142a24:9999,0.081035
551d4e21c720d80086084f45,525e3bfad07b4377dc142a24:9999,0.081036
557bff5276bd54a8df83268a,525e3bfad07b4377dc142a24:9999,0.081036

【讨论】:

    【解决方案2】:

    Sort 将对 csv 和 txt 文件中的数据进行排序,它将在控制台上打印输出

    -t 表示列由 '|' 分隔, -k1 -k2 表示-它将按第 1 列和第 2 列对数据进行排序

    $ sort -t '|' -k1 -k2 <INPUT_FILE>
    

    要将结果存储在输出文件中,请使用以下命令

    $ sort -t '|' -k1 -k2 <INPUT_FILE> -o <OUTPUTFILE>
    

    如果您想忽略标题行,请使用以下命令

    (head -n1 INPUT_FILE && sort <(tail -n+2 INPUT_FILE)) > OUTPUT_FILE
    

    head -n1 INPUT_FILE 仅打印文件的第一行,即标题

    & 这种特殊的 tail 语法将您的文件从第二行直到 EOF。

    【讨论】:

      猜你喜欢
      • 2017-11-28
      • 1970-01-01
      • 2015-12-24
      • 2021-09-04
      • 2015-10-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多