如何打印每个块中的重复数字:block1,block2 ...?

时间:2018-10-22 14:32:36

标签: linux bash awk sed

如何在每个块中打印出重复的数字:block1,block2 ...?

block1
11
12
12
13
block2
11
13
13
11
11

所需的输出:

block1 12 2
block2 13 2
block2 11 3

2 个答案:

答案 0 :(得分:3)

您可以使用此awk

awk 'function prnt() { for (i in seen) if (seen[i] > 1) print b, i, seen[i] }
/^[0-9]+$/ {seen[$1]++; next}
{prnt(); b=$1; delete seen}
END{prnt()}' file

block1 12 2
block2 11 3
block2 13 2

/^[0-9]+$/条件检查$0中的值是否为数字。

答案 1 :(得分:3)

抢救Perl!

perl -lne 'sub output { $seen{$_} > 1 and print "$block $_ $seen{$_}" for keys %seen }
           if (/block/) { output(); %seen = (); $block = $_ }
           else { ++$seen{$_} }
           END { output() }'
  • -n逐行读取输入
  • -l从输入中删除换行符并将其添加到输出中
  • %seen哈希用于计算每个块的出现次数,$block存储当前块的名称
  • 输出已移至子例程,您需要调用它两次:对于每个新块一次,在末尾一次