Припустимо, у мене є файл, подібний до наступного:
123
123
234
234
123
345
Я хотів би дізнатися, скільки разів дублювали «123», скільки разів «234» дублювали і т. Д. Тож в ідеалі результат буде таким:
123 3
234 2
345 1
Припустимо, у мене є файл, подібний до наступного:
123
123
234
234
123
345
Я хотів би дізнатися, скільки разів дублювали «123», скільки разів «234» дублювали і т. Д. Тож в ідеалі результат буде таким:
123 3
234 2
345 1
Відповіді:
Припустимо, що є одне число на рядок:
sort <file> | uniq -c
Ви також можете використовувати більш багатослівний --count
прапор також у версії GNU, наприклад, в Linux:
sort <file> | uniq --count
sort
знову використовувати :sort <file> | uniq -c | sort -n
Це надрукує лише повторювані рядки з підрахунками:
sort FILE | uniq -cd
або, з довгими параметрами GNU (в Linux):
sort FILE | uniq --count --repeated
на BSD та OSX вам потрібно використовувати grep для фільтрації унікальних ліній:
sort FILE | uniq -c | grep -v '^ *1 '
Для наведеного прикладу результатом буде:
3 123
2 234
Якщо ви хочете роздрукувати кількість всіх рядків, включаючи ті, що з’являються лише один раз:
sort FILE | uniq -c
або, з довгими параметрами GNU (в Linux):
sort FILE | uniq --count
Для даного входу вихід:
3 123
2 234
1 345
Для того, щоб сортувати вихід з найчастішими рядками зверху, ви можете зробити наступне (щоб отримати всі результати):
sort FILE | uniq -c | sort -nr
або, щоб отримати лише повторювані рядки, найчастіше найперші:
sort FILE | uniq -cd | sort -nr
на OSX та BSD остаточним стає:
sort FILE | uniq -c | grep -v '^ *1 ' | sort -nr
| sort -n
або | sort -nr
в трубу буде сортувати вихід за кількістю повторень (відповідно або по убуванню). Ви це не просите, але я думав, що це може допомогти.
| awk '$1>100'
sort FILE | uniq -c | grep -v '^ *1 '
Віа awk:
awk '{dups[$1]++} END{for (num in dups) {print num,dups[num]}}' data
У awk 'dups[$1]++'
команді змінна $1
вміщує весь вміст стовпця1, а квадратні дужки мають доступ до масиву. Отже, для кожного 1-го стовпця рядка у data
файлі dups
збільшується вузол названого масиву .
І наприкінці ми перебираємо dups
масив із num
мінливою мінливою величиною і надрукуємо збережені числа спочатку, а потім їх кількість, що дублюється, на dups[num]
.
Зауважте, що у вашому вхідному файлі є пробіли на кінці деяких рядків, якщо ви очистите їх, ви можете використовувати $0
замість $1
команди вище :)
uniq
?
sort | uniq
і рішення awk мають зовсім інші продуктивні та компромісні ресурси: якщо файлів велике, а кількість різних рядків невелика, рішення awk набагато ефективніше. Він лінійний за кількістю рядків, а використання простору - лінійним у кількості різних ліній. ОТО, рішення awk потребує збереження всіх різних рядків у пам’яті, тоді як (GNU) сортування може вдаватися до тимчасових файлів.
У Windows, що використовує "Windows PowerShell", я досягнув цієї команди
Get-Content .\file.txt | Group-Object | Select Name, Count
Також ми можемо використовувати Cmdlet де-об'єкта для фільтрації результату
Get-Content .\file.txt | Group-Object | Where-Object { $_.Count -gt 1 } | Select Name, Count
Припустимо, що у вас є доступ до стандартної оболонки Unix та / або середовища cygwin:
tr -s ' ' '\n' < yourfile | sort | uniq -d -c
^--space char
В основному: перетворіть всі символи простору в рядкові розбиття, потім сортуйте трансляційний вихід і подайте їх на uniq та підрахуйте повторювані рядки.