![计数并求和文件中每个唯一行的出现次数](https://linux22.com/image/64216/%E8%AE%A1%E6%95%B0%E5%B9%B6%E6%B1%82%E5%92%8C%E6%96%87%E4%BB%B6%E4%B8%AD%E6%AF%8F%E4%B8%AA%E5%94%AF%E4%B8%80%E8%A1%8C%E7%9A%84%E5%87%BA%E7%8E%B0%E6%AC%A1%E6%95%B0.png)
我认为这个问题的答案可能是该函数的某种变体,uniq
它允许您计算每行在文件中出现的次数:
sort file.txt | uniq -c
对我来说,问题是我使用这个uniq
函数来生成行计数,并且因为我将输出与其他文件合并,所以我最终在文件中出现了重复的行,需要进一步合理化。
例如,原始uniq
行数位于每行的开头:
34 banana
23 apple
48 grapefruit
23 banana
12 apple
所以我需要做到的是:
57 banana
35 apple
48 grapefruit
SUM
在其余字段相同的所有情况下,是否有一些函数将作用于第一个字段?
答案1
解决方案awk
:
$ awk '{i[$2]+=$1} END{for(x in i){print i[x]" "x}}' file.txt
35 apple
48 grapefruit
57 banana
首先awk
创建一个索引为名称(香蕉、苹果、葡萄柚)的数组,并对第一列中的值求和。最后打印该数组。
答案2
我会用perl。
#!/usr/bin/perl
use strict;
use warnings;
my %count_of;
while ( <> ) {
my ( $word) = m/(\w+)/;
$count_of{$word}++;
}
foreach my $word ( sort { $count_of{$a} <=> $count_of{$b} } keys %count_of ) {
print "$count_of{$word} $word\n";
}
运行它perl script.pl file1 file2 file3 file4
。
或者 - 你可能只想使用 cat.
cat file1 file2 file3 | sort | uniq -c