Знайдіть унікальні лінії


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 раз, тому що вона одразу ж друкує рядок, з яким зустрічається вперше, а для наступних зустрічей вона просто їх пропускає.
Reeshabh Ranjan

Відповіді:


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
Обов’язково сортуйте, якщо записи у файлі чи ще не відсортовані. сортувати файл.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,7OP бажає лише унікальні рядки, що є 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'))

Зверніть увагу, що через порожні рядки остаточний набір може містити рядки '' або лише пробіли. Ви можете видалити це пізніше. Або просто піти з копіюванням з терміналу;)

#

Just FYI, зі сторінки Uniq Man:

"Примітка: 'uniq' не виявляє повторюваних рядків, якщо вони не є сусідніми. Ви можете спершу відсортувати введення або використовувати 'sort -u' без 'uniq'. Крім того, порівняння дотримуються правил, визначених" LC_COLLATE "."

Один із правильних способів викликати за допомогою: # sort nonUnique.txt | uniq

Приклад запуску:

$ 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 
......

Після виконання кота -e all.orted

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

Кожен другий рядок має кінцевий простір :( Після видалення всіх кінцевих просторів це спрацювало!

Дякую

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.