como deletar número duplicado da linha? [fechadas]

0

Arquivo de entrada

1 2 3 1 4 5 6 1 1 2 34 5 6 2

Eu quero saída como esta

1 2 3 4 5 6 34 

(todo o número duplicado deve ser impresso apenas uma vez)

    
por claudia smith 12.07.2018 / 08:14

7 respostas

0

Com awk ( para remover duplicatas do arquivo inteiro ):

awk '{ SEP=""; i=0;  
       while (++i<=NF) { printf (!unq[$i]++? SEP $i:""); SEP=" "};
       print "";
}' infile

ou remover duplicatas de cada linha separadamente :

awk '{ SEP=""; i=0; delete unq;
       while (++i<=NF) { printf (!unq[$i]++? SEP $i:""); SEP=" "};
       print "";
}' infile

Faça um loop sobre números e, se ele não foi visto anteriormente, adicione-o à matriz chamada unq e printf else. Não imprima nada.

leitura futura:

por 12.07.2018 / 14:43
3

Perl para o resgate!

perl -lane 'print join " ", grep ! $seen{$_}++, @F' < file
  • -l remove novas linhas da entrada e adiciona-as à saída
  • -n processa a linha de entrada por linha
  • -a divide cada entrada no espaço em branco no array @F

O array @F é iterado pelo grep , mantendo apenas os elementos vistos pela primeira vez (ou seja, seu valor no % visto hash são zero, como uma negação de zero é verdade). junte-se apenas cole-os novamente.

    
por 12.07.2018 / 08:34
2

NOTA: Esta solução mantém os resultados na sua ordem original!

Uma maneira fácil de fazer isso usando awk e tr . Se o seu conteúdo estiver em um arquivo, FILE :

$ tr ' ' '\n' < FILE | awk '!x[$0]++' | tr '\n' ' '

Exemplo

$ echo "1 2 3 1 4 5 6 1 1 2 34 5 6 2" | \
    tr ' ' '\n' | awk '!x[$0]++' | tr '\n' ' '
1 2 3 4 5 6 34

Como funciona

  • tr ' ' '\n' - troca espaços para novas linhas
  • awk '!x[$0]++' - imprime caracteres que não se repetem
  • tr '\n' ' ' - troca novas linhas de volta para espaços
por 12.07.2018 / 08:35
0

Você pode usar tr , awk ou sed para obter todos os números em uma linha separada e usar sort e uniq para remover entradas duplicadas

Exemplo com tr :

$ tr " " "\n"  < <INPUT-FILE> | sort -u | tr "\n" " "
    
por 12.07.2018 / 08:26
0

Você pode fazer isso com sort . A classificação só opera em linhas, então você precisa substituir os espaços em seu arquivo por novas linhas.

Exemplo se o arquivo test.txt contiver:

 1 2 3 1 4 5 6 1 1 2 34 5 6 2

O código a seguir retornará o que você deseja

>sed "s/ /\n/g" test.txt | sort -un
1
2
3
4
5
6
34

Observe que, embora sort -u retorne "exclusivo" (valores não duplicados), eles serão ordenados alfabeticamente, a menos que você classifique numericamente com sort -n . A classificação é necessária aqui, pois uniq apenas remove duplicados consecutivos, portanto, seria necessário canalizar sort -n | uniq e sort de qualquer maneira.

    
por 12.07.2018 / 09:01
0

Uma maneira simples do estilo Unix de fazer isso é usar os principais utilitários básicos e canalizar o conteúdo do test.txt para o programa apropriado em vez de usar uma linguagem de script completa, como:

$ cat test.txt | tr ' ' '\n' | sort -u | tr '\n' ' '
    
por 12.07.2018 / 15:37
0

No bash: preserva a ordem de leitura. Lê várias linhas no arquivo. Retorna uma única linha.

 unset d
 while read r; do
  [ "$d" ] || d=${r/ */}
  for s in $r; do
    for s2 in $d; do
      if [ "$s" = $s2 ]; then
        s=
        break
      fi
    done
    d="$d $s"
  done
done < file
echo ${d}
unset d r s s2

Um script é melhor

echo '
#!/bin/bash

if [ $# = 0 ]; then
  echo "${0##*/} <filepath>" >&2
  exit
elif [ ! -f $1 ]; then
  echo " Error : $1 is not a file." >&2
  exit 1
fi

while read r; do
  [ "$d" ] || d=${r/ */}
  for s in $r; do
    for s2 in $d; do
      if [ "$s" = $s2 ]; then
        s=
        break
      fi
    done
    d="$d $s"
  done
done < $1
echo ${d}
' > ~/uniq-word

Para usá-lo:

bash ~/uniq-word <filepath>
    
por 12.07.2018 / 18:21