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

46_#1   A
47_#1   B
49_#1   C
51_#1   D
51_#1   E

我想计算第一列中的重复项(只计算 - 不删除)并在下一列中存储计数。所以输出应该是-
46_#1   1  A
47_#1   1  B
49_#1   1  C
51_#1   2  D
51_#1   2  E

我用过 linux 命令-
uniq -c  file

但这将占用整行(不是第一列)然后我使用
uniq -c -w5 file

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

有人可以帮忙吗?

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

最佳答案

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

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";
}

关于linux - 使用 perl/linux 计算特定列中的重复项,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/9033123/

10-13 05:14