encontra valores duplicados em cada linha

0

Como posso imprimir linhas com valores duplicados (x2)?

Por exemplo

01 02 03
01 01 03
01 01 01 03

fora dessas três linhas, apenas a linha dois está correta.

agora, digamos que eu queira procurar a linha onde o valor ocorreu x3.

neste caso, a linha 3 está correta.

    
por Enrik S 12.05.2018 / 19:34

3 respostas

1

com o awk

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

for(i=1;i<=NF;i++) on each field of the line
++a[$i] get each field in a associative array a and incremente it each time we saw a field with the same value.
if(++a[$i]>nb) if the value is more than nb
{print;next} print the line and jump to the next line

Para mostrar apenas a linha com 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
    
por 12.05.2018 / 20:05
0

Com o AWK:

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

Isso processa cada linha e, dentro de cada linha, conta as ocorrências de cada valor (cada campo) na matriz associativa c ; em seguida, ele passa por todos os valores v que viu e, se um dos valores foi visto no número de vezes necessário (conforme especificado pelo destino, t ), ele imprime a linha e pula para a próxima linha para evitar imprimir a linha várias vezes ( por exemplo, para 01 01 03 03 ).

    
por 12.05.2018 / 20:53
0

Isso só imprimirá linhas com palavras delimitadas por espaço duplicado:

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

Para o seu exemplo, a saída será:

01 01 03

01 01 01 03

Aqui, para mais de uma ocorrência de "01" nas linhas 2 e 3 ...

Se você quiser especificar o número de vezes que uma palavra deve ser verificada para ser repetida, então:

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

Para o seu exemplo, a saída será:

for line 1

for line 2

for line 3

 3 01

O primeiro número é o número de vezes que você especificou na variável NO para o número de ocorrências a serem verificadas.
O segundo número é a palavra real que se descobriu estar repetindo NO vezes.
Mudar o YOURFILE para o seu arquivo, é claro.

    
por 12.05.2018 / 21:00

Tags