查找每一行中的重复值

查找每一行中的重复值

如何打印具有重复 (x2) 值的行?

例如

01 02 03
01 01 03
01 01 01 03

这三行中,只有第二行是正确的。

现在假设我想查找值出现 x3 的行。

在这种情况下,第 3 行是正确的。

答案1

用 awk

awk -v nb=3 '{for(i=1;i<=NF;i++)if(++a[$i]>nb){print;next}}' infile

for(i=1;i<=NF;i++) 在 ++a[$i] 行的每个字段上
获取关联数组 a 中的每个字段,并在每次看到具有相同值的字段时递增它。
if(++a[$i]>nb) 如果值大于 nb
{print;next} 打印该行并跳转到下一行


仅显示行nb

awk -v nb=3 '
{
    max = 0
    delete a
    for ( i=1 ; i<=NF ; i++ )
        ++a[$i]
    for( j in a )
        max = a[j]>max ? a[j] : max
    if ( max == nb )
        print
}' infile

答案2

使用 AWK:

awk -v t=2 '{for (i=1; i<=NF; i++) c[$i]++; for (v in c) if (c[v] == t) {print; next}}'

这会处理每一行,并在每一行内计算关联数组中每个值(每个字段)的出现次数c;然后它会遍历它看到的所有值v,如果其中一个值被看到所需的次数(由目标指定t),它会打印该行,并跳到下一行以避免多次打印该行次(例如为了01 01 03 03)。

答案3

这只会打印具有重复空格分隔单词的行:

while IFS='' read -r line ; do  if [[ "`echo $line | tr ' ' '\n'| sort | uniq -d`" != '' ]]; then echo "$line"; fi; done < YOURFILE

对于您的示例,输出将是:

01 01 03

01 01 01 03

在这里,对于第 2 行和第 3 行中多次出现的“01”...

如果你想指定一个单词应该被检查重复的次数,那么:

NO=3; lnr=1 ; while IFS='' read -r line ; do echo "for line" $lnr ; echo $line | tr ' ' '\n' | uniq -c| grep -e "^\s*$NO" ; ((lnr++)); done < YOURFILE

对于您的示例输出将是:

对于 1 号线

2号线

3号线

 3 01

NO第一个数字是您在变量中指定要检查的出现次数的次数。
第二个数字是被发现没有重复的实际单词。
当然,将 YOURFILE 更改为您的文件。

相关内容