首页 > 解决方案 > awk 在列中使用少于 3 个唯一字符的过滤器

问题描述

我在文件中有一个数据集

1   AAA
1   AAAB
1   AAABC
2   ABCD
2   ABCDE
3   AABB
3   AABCD
3   ABCDE
3   ABBCCDE

期望的输出

1   AAABC
2   ABCD
2   ABCDE
3   AABCD
3   ABCDE
3   ABBCCDE

我努力了 :

awk 'BEGIN{FS="\t"; OFS="\t"} {
unq=0; delete seen; for (i=1; i<=NF; i++) if (!seen[$i]++) unq++} unq > 3' file

但我无法得到任何结果。

标签: awk

解决方案


perl

$ perl -MList::Util=uniq -lane 'print if scalar(uniq split(//,$F[1])) > 2' ip.txt
1   AAABC
2   ABCD
2   ABCDE
3   AABCD
3   ABCDE
3   ABBCCDE

$F[1]有第二列,然后使用空的正则表达式将其拆分为字符。从此数组中,使用删除重复项uniq,然后使用获取数组的大小scalar


类似的解决方案ruby

ruby -lane 'print if $F[1].chars.uniq.size > 2'

推荐阅读