Encontre linhas exclusivas


92

Como posso encontrar as linhas exclusivas e remover todas as duplicatas de um arquivo? Meu arquivo de entrada é

1
1
2
3
5
5
7
7

Eu gostaria que o resultado fosse:

2
3

sort file | uniqnão vai fazer o trabalho. Irá mostrar todos os valores 1 vez


17
O arquivo deve ser classificado primeiro. sort file | uniq -uirá imprimir no console para você.
ma77c de

Acho que o motivo de sort file | uniqmostrar todos os valores 1 vez é porque ele imprime imediatamente a linha que encontra na primeira vez e, para os encontros subsequentes, simplesmente os ignora.
Reeshabh Ranjan

Respostas:


91

uniq tem a opção de que você precisa:

   -u, --unique
          only print unique lines
$ cat file.txt
1
1
2
3
5
5
7
7
$ uniq -u file.txt
2
3

33
Certifique-se de classificar se as entradas no arquivo já foram ou não classificadas. sort file.txt | uniq
user3885927

veja minha resposta se não quiser classificar primeiro. stackoverflow.com/a/54803217/5441945
hychou

28

Use da seguinte maneira:

sort < filea | uniq > fileb

2
Isso não está correto, acho que você quis dizer:uniq -u filea > fileb
Chris Seymour

1
Eu copiar seus dados e executá-lo e ele funciona: sort<filea.txt | uniq>fileb.txt. Talvez você tenha omitido as extensões. Estou usando um Mac OS X. você tem que ir filea.txtpara outrofileb.txt
Kasavbere

Não há necessidade de redirecionamento com sorte para que serve uniqquando você pode apenas fazer sort -u file -o fileo que está fazendo é remover os valores duplicados ou seja, filebcontém 1,2,3,5,7o OP deseja as linhas únicas que são 2,3e são alcançadas pela uniq -u fileextensão do arquivo não tem nada com isso, sua resposta está errada.
Chris Seymour

13

Você também pode imprimir o valor único em "arquivo" usando o catcomando direcionando para sorteuniq

cat file | sort | uniq -u


9

uniq -u tem me deixado louco porque não funcionou.

Então, em vez disso, se você tiver python (a maioria das distros e servidores Linux já o tem):

Supondo que você tenha o arquivo de dados em notUnique.txt

#Python
#Assuming file has data on different lines
#Otherwise fix split() accordingly.

uniqueData = []
fileData = open('notUnique.txt').read().split('\n')

for i in fileData:
  if i.strip()!='':
    uniqueData.append(i)

print uniqueData

###Another option (less keystrokes):
set(open('notUnique.txt').read().split('\n'))

Observe que, devido às linhas vazias, o conjunto final pode conter '' ou apenas strings de espaço. Você pode remover isso mais tarde. Ou simplesmente copie do terminal;)

#

Apenas para sua informação, da página de manual da uniq:

"Nota: 'uniq' não detecta linhas repetidas a menos que sejam adjacentes. Você pode querer classificar a entrada primeiro ou usar 'sort -u' sem 'uniq'. Além disso, as comparações respeitam as regras especificadas por 'LC_COLLATE'."

Uma das maneiras corretas de invocar com: # sort nonUnique.txt | uniq

Exemplo de execução:

$ cat x
3
1
2
2
2
3
1
3

$ uniq x
3
1
2
3
1
3

$ uniq -u x
3
1
3
1
3

$ sort x | uniq
1
2
3

Os espaços podem ser impressos, então esteja preparado!


3
Isso é um exagero.
SmallChess de

9

Embora sortleve um tempo O (n log (n)), eu prefiro usar

awk '!seen[$0]++'

awk '!seen[$0]++'é uma abreviatura de awk '!seen[$0]++ {print}'print line (= $ 0) se seen[$0]não for zero. É preciso mais espaço, mas apenas tempo O (n).


7

você pode usar:

sort data.txt| uniq -u

este classifica os dados e filtra por valores únicos



3

uniq deve funcionar bem se o seu arquivo for / puder ser classificado, se você não puder classificar o arquivo por algum motivo, você pode usar awk :

awk '{a[$0]++}END{for(i in a)if(a[i]<2)print i}'


3
sort -d "file name" | uniq -u

isso funcionou para mim por um semelhante. Use isto se não estiver combinado. Você pode remover a classificação, se for organizado


3

Acho isso mais fácil.

sort -u input_filename > output_filename

-u significa único.


0

Foi a primeira vez que tentei

skilla:~# uniq -u all.sorted  

76679787
76679787 
76794979
76794979 
76869286
76869286 
......

Depois de fazer um gato-e tudo.

skilla:~# cat -e all.sorted 
$
76679787$
76679787 $
76701427$
76701427$
76794979$
76794979 $
76869286$
76869286 $

Cada segunda linha tem um espaço à direita :( Depois de remover todos os espaços à direita, funcionou!

obrigado

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.