我有一个大的 CSV 文件,我想按列 2 和列 3 对其进行排序,并且只从第 2 列中获取具有唯一值的前 3 行。所以我搜索类似的东西:
排序 -K2,2 -K3,3 -U2,2-3(-U2,2-3 部分在现实中不存在)。
知道如何在不自己编写程序的情况下在命令行上执行此操作吗?
这很丑陋,但我认为这会起作用。
假设:
- 您的文件名为
$FILE
。 - 该文件仅包含以逗号分隔的数字。
法典:
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
逐行说明:
-
awk:
打印文件中所有非空行的行号以及字段 2 和 3。稍后,我们将使用行号作为索引,在对字段 2 和 3 进行排序后,从$FILE
中提取所需的行。 -
sort:
按字段 2 和 3 按数字方式对输出进行排序。 -
awk:
删除字段 3,仅保留行号和字段 2。 -
uniq:
仅打印唯一的行,忽略行号。 -
head:
仅打印前 3 行。 -
while:
读取 3 行号,忽略每行的其余部分。从原始文件打印该行。