我有一个大的CSV文件,我希望按列2和列3对其进行排序,并且只从Rank2获取具有唯一值的前3行。所以我搜索类似的东西:
sort -k2,2 -k3,3 -u2,2-3(-u2,2-3部分实际上不存在)。
如果不自己编写程序,不知道如何在命令行上执行此操作吗?
答案 0 :(得分:0)
这很难看,但我认为这会奏效。
<强>假设:强>
$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行代码,忽略每行的剩余部分。从原始文件打印该行。