使用CSV文件中的唯一值提取前3行

时间:2014-02-19 13:40:12

标签: linux csv command-line-interface

我有一个大的CSV文件,我希望按列2和列3对其进行排序,并且只从Rank2获取具有唯一值的前3行。所以我搜索类似的东西:

sort -k2,2 -k3,3 -u2,2-3(-u2,2-3部分实际上不存在)。

如果不自己编写程序,不知道如何在命令行上执行此操作吗?

1 个答案:

答案 0 :(得分:0)

这很难看,但我认为这会奏效。

<强>假设:

  1. 您的文件名为$FILE
  2. 该文件仅包含以逗号分隔的数字。
  3. <强>代码:

    awk 'BEGIN { FS="," } !/^$/ { print NR,$2,$3 }' < $FILE |
        sort -nk 2,3 |
        awk '{ print $1,$2 }'
        uniq -uf 1 |
        head -n 3 |
        while read num ignore; do sed -n "${num}p" < $FILE; done
    

    逐行说明:

    1. awk:打印文件中所有非空白行的行号和字段2和3。之后,在我们对字段2和3进行排序后,我们将使用行号作为索引从$FILE中提取所需的行。
    2. sort:按字段2和3以数字方式对输出进行排序。
    3. awk:删除字段3,只留下行号和字段2.
    4. uniq:仅打印唯一的行,忽略行号。
    5. head:仅打印前3行。
    6. while:读取3行代码,忽略每行的剩余部分。从原始文件打印该行。