我有一个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+0
var中的整数值。按姓氏分组的未排序文件示例
$ 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