Форум русскоязычного сообщества Ubuntu


Следите за новостями русскоязычного сообщества Ubuntu в Twitter-ленте @ubuntu_ru_loco

Автор Тема: Удаление дубликатов строк из несортированного текста  (Прочитано 1161 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн ReNzRv

  • Автор темы
  • Старожил
  • *
  • Сообщений: 2648
    • Просмотр профиля
Вот здесь нашел пример решения:
Код: (awk) [Выделить]
if (data[$0]++ == 0)
lines[++count] = $0 ""
END -
for (i = 1; i != count; i++)
print lines[i] ""

Тестовый Text.txt:
Код: (html5) [Выделить]
Text 1235
Text 123
Text 1237
Text 1234
Text 1235
Text 1236
Text 1237
Text 1238
sort Text.txt | uniq -dc
      2 Text 1235
      2 Text 1237

Переписал так в одну строку:
Код: (awk) [Выделить]
{if (data[$0]++ == 0) ; lines[++count] = $0 ""}; END {for (i = 1; i != count; i++) print lines[i] ""}
НО не работает:
cat Text.txt | awk '{if (data[$0]++ == 0) ; lines[++count] = $0 ""}; END {for (i = 1; i != count; i++) print lines[i] ""}'
Код: (html5) [Выделить]
Text 1235
Text 123
Text 1237
Text 1234
Text 1235
Text 1236
Text 1237

Что не так?
« Последнее редактирование: 14 Сентября 2016, 22:04:33 от renzrv »

Оффлайн Azure

  • Модератор раздела
  • Старожил
  • *
  • Сообщений: 6017
  • Windows10, i3wm on Debian9, Manjaro20.0
    • Просмотр профиля
Можно из без awk
Код: (bash) [Выделить]
nl -nln Text.txt |
sort -k2V |
uniq -dcf1 |
sort -k3n,3n |
sed 's/[0-9]\+\s*//2'

Пользователь добавил сообщение 14 Сентября 2016, 20:50:46:
Код: (awk) [Выделить]
seen[$0]++ == 1{
    line[NR]=$0
    }
END{
    for(i in line)
        print seen[line[i]], line[i]
   }
« Последнее редактирование: 14 Сентября 2016, 20:59:59 от Azure »
В Линукс можно сделать ВСЁ что угодно, достаточно знать КАК !

Оффлайн ReNzRv

  • Автор темы
  • Старожил
  • *
  • Сообщений: 2648
    • Просмотр профиля
nl -nln Text.txt | sort -k2V | uniq -dcf1 | sort -k3n,3n | sed 's/[0-9]\+\s*/-/'
      -1      Text 1235
      -3      Text 1237
cat Text.txt | awk 'seen[$0]++ == 1{line[NR]=$0}; END{for(i in line) print seen[line[i]], line[i]}'
2 Text 1235
2 Text 1237
ошибка?

Пользователь добавил сообщение 14 Сентября 2016, 20:58:38:
sort Text.txt | uniq -dc
      2 Text 1235
      2 Text 1237
Это я написал чтобы показать дубликаты строк.

Смысл - удалить из строк дубликаты без сортировки. Результат такой должен быть:
Код: (html5) [Выделить]
Text 1235
Text 123
Text 1237
Text 1234
Text 1236
Text 1238
« Последнее редактирование: 14 Сентября 2016, 21:04:13 от renzrv »

Оффлайн Azure

  • Модератор раздела
  • Старожил
  • *
  • Сообщений: 6017
  • Windows10, i3wm on Debian9, Manjaro20.0
    • Просмотр профиля
ошибка?
Скопировал промежуточный тестовый вариант. Поправил.
Уникальные строки без сортировки выводятся так
Код: (awk) [Выделить]
awk '!seen[$0]++' Text.txt
Пользователь добавил сообщение 14 Сентября 2016, 21:07:09:
Конечно после awk не так красиво
Код: (bash) [Выделить]
nl -nln Text.txt | sort -k2 -u | sort -n -k1,1 | cut -f2-
« Последнее редактирование: 14 Сентября 2016, 21:08:29 от Azure »
В Линукс можно сделать ВСЁ что угодно, достаточно знать КАК !

Оффлайн ReNzRv

  • Автор темы
  • Старожил
  • *
  • Сообщений: 2648
    • Просмотр профиля
Как просто)) :D Зачем такой код там в ссылке в нагородили? Спасибо.
« Последнее редактирование: 14 Сентября 2016, 21:11:39 от renzrv »

 

Страница сгенерирована за 0.056 секунд. Запросов: 25.