Linux 从外壳上移除顶部k重复线

Linux 从外壳上移除顶部k重复线,linux,shell,Linux,Shell,我有一个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

我有一个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
解释

要通过最大迭代次数:
-vk=2

我们使用关联,它的键由行的前两个字段构成
$1,$2
,这些字段由逗号分隔:
-F\,

每当我们找到同一个键:
a[$1,$2]+


awk
中,如果表达式满足一个条件,那么默认的操作是打印当前行/行,因此我们只显示所创建键的最多
k
行程:
您可以添加一个简短的解释吗?谢谢,最后一个问题。如果行不按名字/姓氏“分组”,而不更改给定文件的顺序,是否也可以这样做?原因是行是根据第3列和第4列预先排序的,我想为每个第一名/姓氏选择前k是的,您不需要将其分组,
awk
将打印源文件中找到的行,顺序不会改变。检查更新的意义是什么,然后试着运行这个xP:
awk-F\,-vk=dummy'a[$1$2]++
John,Smith, 2, 3
John,Smith, 2, 3
Adam,Brown, 2, 3
Adam,Brown, 5, 6
Thom,Bow, 1, 5
$ 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