从 CSV 文件中提取具有 UNIQ 值的前 3 行



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

排序 -K2,2 -K3,3 -U2,2-3(

-U2,2-3 部分在现实中不存在)。

知道如何在不自己编写程序的情况下在命令行上执行此操作吗?

这很丑陋,但我认为这会起作用。

假设:

  1. 您的文件名为 $FILE
  2. 该文件仅包含以逗号分隔的数字。

法典:

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 行号,忽略每行的其余部分。从原始文件打印该行。

最新更新