我有一个csv文件,看起来像这样

John,Smith, 2, 3
John,Smith, 2, 3
John,Smith, 1, 4
John,Smith, 6, 2
Adam,Brown, 2, 3
Adam,Brown, 5, 6
Adam,Brown, 1, 1
Thom,Bow, 1, 5

我想把每个名字和姓氏出现的前k行按外观顺序保留下来。k=2的输出应该是
John,Smith, 2, 3
John,Smith, 2, 3
Adam,Brown, 2, 3
Adam,Brown, 5, 6
Thom,Bow, 1, 5

所有行的列数不一定相同。但是,前两列始终存在。

最佳答案

awk你的朋友在这里:

awk -F\, -v k=2 'a[$1, $2]++<k+0' file

结果
John,Smith, 2, 3
John,Smith, 2, 3
Adam,Brown, 2, 3
Adam,Brown, 5, 6
Thom,Bow, 1, 5

解释
要通过最大迭代次数:-v k=2
我们使用关联的array,它的键由行的前两个字段组成,这些字段由逗号字符分隔:$1, $2
每当我们找到同一个键时,-F\,键的数组值都会增加:$1, $2
a[$1, $2]++中,如果表达式满足条件,则默认动作是打印当前行/行,所以我们只会显示所创建密钥的最大<awk逗号:k
注:<k+0中的+0是一种安全机制,用于强制k+0var中的整数值。
按姓氏分组的未排序文件示例
$ cat file
John,Smith, 2, 3
Adam,Brown, 2, 3
John,Smith, 2, 3
Thom,Bow, 1, 5
Adam,Brown, 5, 6
Adam,Brown, 1, 1
John,Smith, 1, 4
John,Smith, 6, 2

使用按第二个字段排序:
$ awk -F\, -v k=2 'a[$1, $2]++<k+0' file|sort -r -t, -k 2
John,Smith, 2, 3
John,Smith, 2, 3
Adam,Brown, 5, 6
Adam,Brown, 2, 3
Thom,Bow, 1, 5

10-08 19:57