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 | uniq
não vai fazer o trabalho. Irá mostrar todos os valores 1 vez
sort file | uniq -u
irá imprimir no console para você.sort file | uniq
mostrar todos os valores 1 vez é porque ele imprime imediatamente a linha que encontra na primeira vez e, para os encontros subsequentes, simplesmente os ignora.Respostas:
uniq
tem a opção de que você precisa:fonte
Use da seguinte maneira:
fonte
uniq -u filea > fileb
sort<filea.txt | uniq>fileb.txt
. Talvez você tenha omitido as extensões. Estou usando um Mac OS X. você tem que irfilea.txt
para outrofileb.txt
sort
e para que serveuniq
quando você pode apenas fazersort -u file -o file
o que está fazendo é remover os valores duplicados ou seja,fileb
contém1,2,3,5,7
o OP deseja as linhas únicas que são2,3
e são alcançadas pelauniq -u file
extensão do arquivo não tem nada com isso, sua resposta está errada.Você também pode imprimir o valor único em "arquivo" usando o
cat
comando direcionando parasort
euniq
cat file | sort | uniq -u
fonte
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
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:
Os espaços podem ser impressos, então esteja preparado!
fonte
Embora
sort
leve um tempo O (n log (n)), eu prefiro usarawk '!seen[$0]++'
é uma abreviatura deawk '!seen[$0]++ {print}'
print line (= $ 0) seseen[$0]
não for zero. É preciso mais espaço, mas apenas tempo O (n).fonte
você pode usar:
este classifica os dados e filtra por valores únicos
fonte
uniq -u < file
fará o trabalho.fonte
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 usarawk
:awk '{a[$0]++}END{for(i in a)if(a[i]<2)print i}'
fonte
isso funcionou para mim por um semelhante. Use isto se não estiver combinado. Você pode remover a classificação, se for organizado
fonte
Acho isso mais fácil.
-u
significa único.fonte
Foi a primeira vez que tentei
Depois de fazer um gato-e tudo.
Cada segunda linha tem um espaço à direita :( Depois de remover todos os espaços à direita, funcionou!
obrigado
fonte