2017-01-02 39 views
1

我正在处理大数据集,我需要为每个唯一的ID($ 1)提供和打印数字订单,并且想要删除上面的行335每个唯一ID的数字顺序。我怎样才能给每一行的数字订单基于唯一的ID

的数据看起来像

101 24 
101 13 
101 15 
102 25 
102 21 
102 23 
103 20 
103 12 
103 18 

输出看起来像这样

101 24 1 
101 13 2 
101 15 3 
102 25 1 
102 21 2  
102 23 3 
103 20 1 
103 12 2 
103 18 3   
+0

多大集ID? –

+0

@詹姆斯数据包含1100多万行和24个字段。 – Alula

+0

@Alula文件是按第一个字段排序的,这样所有具有相同值的行都在文件的一个地方? –

回答

4

尝试以下一个

输入

$ cat f 
101 24 
101 13 
101 15 
102 25 
102 21 
102 23 
103 20 
103 12 
103 18 

输出

$ awk '{print $0,++a[$1]}' f 
101 24 1 
101 13 2 
101 15 3 
102 25 1 
102 21 2 
102 23 3 
103 20 1 
103 12 2 
103 18 3 

如果数据进行排序(列1),然后使用下面的一个,快

$ awk '$1!=p{n=0}{print $0,++n; p=$1}' f 
101 24 1 
101 13 2 
101 15 3 
102 25 1 
102 21 2 
102 23 3 
103 20 1 
103 12 2 
103 18 3 

要删除上述335

$ awk '$1!=p{n=0; p=$1}++n<335{print $0,n}' f 


$ awk '++a[$1]<335{print $0,a[$1]}' f 
+0

它是否可以为每个唯一ID删除高于335数字顺序的行? – Alula

+1

显然我的解决方案和后面的++完全一样。无论如何,使用后者会消耗更少的内存。 –

+1

@JamesBrown哥哥有时候会发生,可能会在我发布之前几秒钟:) –

相关问题