使用perl/linux计算特定列中的重复项

Vik*_*kas 2 linux perl

我有一个带有6列的文件(制表符分隔)(为简单起见,我在这里显示了2列)

46_#1   A   
47_#1   B   
49_#1   C   
51_#1   D   
51_#1   E
Run Code Online (Sandbox Code Playgroud)

我想计算第一列中的重复项(仅计数 - 不删除)和下一列中的存储计数.所以输出应该是 -

46_#1   1  A    
47_#1   1  B    
49_#1   1  C    
51_#1   2  D    
51_#1   2  E
Run Code Online (Sandbox Code Playgroud)

我用linux命令 -

uniq -c  file
Run Code Online (Sandbox Code Playgroud)

但是我会使用整条线(不是第1列)

uniq -c -w5 file
Run Code Online (Sandbox Code Playgroud)

但是第一列中的字数可能会有所不同.

有人可以帮忙吗?

PS-我有一个非常大的文件(大约1GB).

Bor*_*din 5

我不喜欢只提供完整的解决方案,但它似乎是最简单的解释方式.该程序读取文件两次:首先累加频率信息,然后输出修改后的数据.

use strict;
use warnings;

@ARGV or die "No input file specified";

open my $fh, '<', $ARGV[0] or die "Unable to open input file: $!";

my %count;

while (<$fh>) {
  next unless my ($key) = split;
  $count{$key}++;
}

seek $fh, 0, 0;
while (<$fh>) {
  chomp;
  next unless my ($key, $rest) = split ' ', $_, 2;
  print "$key $count{$key} $rest\n";
}
Run Code Online (Sandbox Code Playgroud)