2014-02-19 45 views
0

我有一个很大的CSV文件,我想按column2和column3对它进行排序,并且只取第2行中具有唯一值的前3行。所以我寻找类似的东西:从CSV文件中提取前3行,包含uniq值

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

任何想法如何在命令行上做到这一点,而无需自己编写程序?

+0

_“没有自己编写程序吗?”_你将以编写CLI程序结束(它将由bash执行) –

回答

0

这很丑,但我认为这会奏效。

假设:

  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文件。稍后,我们将使用行号作为索引所需的线从$FILE提取,我们的字段2和3
  2. sort:排序数值由字段2和3
  3. awk:删除排序后输出字段3,只留下行号和字段2.
  4. uniq:仅打印唯一的行,忽略行号。
  5. head:只打印前3行。
  6. while:阅读3行数字,忽略每行的其余部分。从原始文件中打印该行。