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


Увидели сообщение с непонятной ссылкой, спам, непристойность или оскорбление?
Воспользуйтесь ссылкой «Сообщить модератору» рядом с сообщением!

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

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

Оффлайн ReNzRv

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

Тестовый Text.txt:
Код: HTML5
  1. Text 1235
  2. Text 123
  3. Text 1237
  4. Text 1234
  5. Text 1235
  6. Text 1236
  7. Text 1237
  8. Text 1238
  9.  
sort Text.txt | uniq -dc
      2 Text 1235
      2 Text 1237

Переписал так в одну строку:
Код: awk
  1. {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
  1. Text 1235
  2. Text 123
  3. Text 1237
  4. Text 1234
  5. Text 1235
  6. Text 1236
  7. Text 1237

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

Оффлайн Azure

  • Модератор раздела
  • Старожил
  • *
  • Сообщений: 5660
  • elementaryOS 0.4 Loki, i3wm on Debian9
    • Просмотр профиля
Можно из без awk
Код: Bash
  1. nl -nln Text.txt |
  2. sort -k2V |
  3. uniq -dcf1 |
  4. sort -k3n,3n |
  5. sed 's/[0-9]\+\s*//2'

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

Оффлайн ReNzRv

  • Автор темы
  • Старожил
  • *
  • Сообщений: 1967
    • Просмотр профиля
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
  1. Text 1235
  2. Text 123
  3. Text 1237
  4. Text 1234
  5. Text 1236
  6. Text 1238
« Последнее редактирование: 14 Сентябрь 2016, 21:04:13 от renzrv »

Оффлайн Azure

  • Модератор раздела
  • Старожил
  • *
  • Сообщений: 5660
  • elementaryOS 0.4 Loki, i3wm on Debian9
    • Просмотр профиля
ошибка?
Скопировал промежуточный тестовый вариант. Поправил.
Уникальные строки без сортировки выводятся так
Код: awk
  1. awk '!seen[$0]++' Text.txt

Пользователь добавил сообщение 14 Сентябрь 2016, 21:07:09:
Конечно после awk не так красиво
Код: Bash
  1. nl -nln Text.txt | sort -k2 -u | sort -n -k1,1 | cut -f2-
« Последнее редактирование: 14 Сентябрь 2016, 21:08:29 от Azure »
В Линукс можно сделать ВСЁ что угодно, достаточно знать КАК !

Оффлайн ReNzRv

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

 

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