Найдите уникальные линии


90

Как найти уникальные строки и удалить все дубликаты из файла? Мой входной файл

1
1
2
3
5
5
7
7

Я бы хотел, чтобы результат был:

2
3

sort file | uniqне будет работать. Покажет все значения 1 раз


17
Файл необходимо сначала отсортировать. sort file | uniq -uвыведет за вас на консоль.
ma77c

Я думаю, что причина sort file | uniqпоказывает все значения 1 раз, потому что он сразу же печатает строку, с которой сталкивается в первый раз, а для последующих встреч просто пропускает их.
Ришаб Ранджан,

Ответы:


88

uniq есть вариант, который вам нужен:

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

32
Убедитесь, что вы выполняете сортировку, если записи в файле или еще не отсортированы. sort file.txt | uniq
user3885927

см. мой ответ, если вы не хотите сначала выполнять сортировку. stackoverflow.com/a/54803217/5441945
hychou

28

Используйте следующим образом:

sort < filea | uniq > fileb

2
Это неверно, я думаю, вы имели в виду:uniq -u filea > fileb
Крис Сеймур

1
Я скопировать данные и запустить его и он работает: sort<filea.txt | uniq>fileb.txt. Возможно, вы не учли расширения. Я использую Mac OS X. Вам нужно перейти с filea.txtдругого на другойfileb.txt
kasavbere

Там нет необходимости в перенаправлении с sortи что точка трубопровода , чтобы , uniqкогда вы могли бы просто сделать sort -u file -o fileто , что вы делаете , это удалить повторяющиеся значения , то есть ваши filebсодержит 1,2,3,5,7ОП хочет только уникальные линии, является 2,3и достигается путем uniq -u fileрасширения файла не имеет ничего с этим, ваш ответ неверен.
Крис Сеймур

12

Вы также можете распечатать уникальное значение в «файле» с помощью catкоманды, подключившись к sortиuniq

cat file | sort | uniq -u


9

uniq -u сводил меня с ума, потому что он не работал.

Итак, вместо этого, если у вас есть python (в большинстве дистрибутивов и серверов Linux он уже есть):

Предполагая, что у вас есть файл данных в 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'))

Обратите внимание, что из-за пустых строк окончательный набор может содержать строки «» или только пробелы. Вы можете удалить это позже. Или просто уйти от копирования с терминала;)

#

Просто к сведению, со страницы uniq Man:

«Примечание. 'Uniq' не обнаруживает повторяющиеся строки, если они не являются смежными. Вы можете сначала отсортировать ввод или использовать 'sort -u' без 'uniq'. Кроме того, при сравнении соблюдаются правила, указанные в 'LC_COLLATE'».

Один из правильных способов вызова: # sort nonUnique.txt | уникальный

Пример выполнения:

$ 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

Пробелы могут быть напечатаны, так что будьте готовы!


3
Это перебор.
SmallChess

9

Хотя sortзанимает время O (n log (n)), я предпочитаю использовать

awk '!seen[$0]++'

awk '!seen[$0]++'является сокращением для awk '!seen[$0]++ {print}'строки печати (= $ 0), если seen[$0]не равно нулю. Это займет больше места, но только O (n) времени.


7

ты можешь использовать:

sort data.txt| uniq -u

эти данные сортируются и фильтруются по уникальным значениям



3

uniqдолжен работать нормально, если ваш файл / может быть отсортирован, если вы не можете отсортировать файл по какой-то причине, вы можете использовать awk:

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


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

это сработало для меня для аналогичного. Используйте это, если это не устроено. Вы можете удалить сортировку, если она организована



0

Это был первый я пробовал

skilla:~# uniq -u all.sorted  

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

После выполнения cat -e all.sorted

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

Каждая вторая строка имеет конечный пробел :( После удаления всех конечных пробелов все заработало!

Спасибо

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.