Linhas exclusivas com palavras únicas

1

Ajude-me a imprimir linhas exclusivas no Linux. Exemplos de palavras como

A B
B C
C D
A E
F G
H I
I J

a saída deve ser

F G
H I

Ou seja, a linha deve ser única no início e as palavras na linha também devem aparecer apenas uma vez, como no exemplo acima, "FG" é uma linha única e nem "F" ou "G" nunca existe em qualquer outra linha "HI".

    
por user26845 05.11.2012 / 11:58

2 respostas

1

Você pode obter a lista de palavras únicas. E então, as linhas correspondentes seriam linhas cujas palavras são únicas:

tr -cs 'A-Z' '[\n*]' < words.txt |
  sort |
  uniq -u |
  perl -lne '
    if ($ARGV eq "-") {
      $u{$_}=1;
      next
    }
    for $w (/[A-Z]+/g) {
      next LINE unless $u{$w}
    }
    print' - words.txt

Altere A-Z para a lista de caracteres que constituem uma palavra.

    
por 05.11.2012 / 12:34
1

Você poderia fazer assim com o awk:

unique.awk

FNR == NR {
  for(i=1; i<=NF; i++)
    if(++w[$i] > 1)
      not_unique[$i] = 1
  next
}

{
  for(i=1; i<=NF; i++)
    if(not_unique[$i])
      next
}

1

Execute assim:

awk -f unique.awk infile infile

Saída:

F G

Como um verso:

awk 'FNR == NR { for(i=1; i<=NF; i++) if(++w[$i] > 1) not_unique[$i] = 1; next } { for(i=1; i<=NF; i++) if(not_unique[$i]) next } 1' infile infile

Explicação

O arquivo precisa ser analisado duas vezes, primeiro para localizar todas as palavras não exclusivas e, em seguida, para imprimir as linhas que contêm apenas palavras únicas. Isso é refletido na estrutura do programa, o primeiro bloco cria um hash contendo palavras que não são exclusivas, o segundo verifica cada linha e a ignora se tiver palavras não únicas. O 1 final no final só é atingido quando ocorrem linhas exclusivas e invoca a ação padrão do awk ( { print $0 } ).

    
por 05.11.2012 / 12:48

Tags