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


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

Автор Тема: Найти одинаковые строки в файле!  (Прочитано 9823 раз)

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

Оффлайн lumen_xp

  • Автор темы
  • Новичок
  • *
  • Сообщений: 24
    • Просмотр профиля
Господа прошу помощи.
Необходим скрипт поиска одинаковых строк в ОДНОМ файле с последующим удаленмием одной из идентичных строк.
Может кто уже сталкивался... У меня с программированием туго по этому и прошу помощи.

Оффлайн Kwah

  • Старожил
  • *
  • Сообщений: 1442
  • Ubuntu 17.10
    • Просмотр профиля
Re: Найти одинаковые строки в файле!
« Ответ #1 : 09 Июля 2008, 12:31:51 »
Определи признак одинаковости.

Оффлайн lumen_xp

  • Автор темы
  • Новичок
  • *
  • Сообщений: 24
    • Просмотр профиля
Re: Найти одинаковые строки в файле!
« Ответ #2 : 09 Июля 2008, 12:33:30 »
Полностью идентичная строка. Все знаки одинаковы в том числе и пробелы в тех же местах.

Оффлайн Kwah

  • Старожил
  • *
  • Сообщений: 1442
  • Ubuntu 17.10
    • Просмотр профиля
Re: Найти одинаковые строки в файле!
« Ответ #3 : 09 Июля 2008, 12:45:30 »
Количество одинаковых строк? Должна остаться только одна из всех (первая, последняя, какая-то ещё)? Положение в файле важно? Ограничения на размеры входного файла есть? Пример ввода/желаемого вывода можешь продемонстировать?

Оффлайн lumen_xp

  • Автор темы
  • Новичок
  • *
  • Сообщений: 24
    • Просмотр профиля
Re: Найти одинаковые строки в файле!
« Ответ #4 : 09 Июля 2008, 13:00:07 »
Количество одинаковых строк неизвестно. Необходимо оставить одну из одинаковых остальные же (одинаковые) удалить. Где эта строка останется не важно. А вывод желательно оставить тем же.
Вот пример
192.168.4.182    192.168.3.3      6     3182     3128     404         5
192.168.4.182    192.168.3.3      6     3183     3128     1016        7
192.168.4.182    192.168.3.3      6     3182     3128     404         5
192.168.4.182    192.168.3.3      6     3185     3128     1016        7
 Вот по сути первая и третья строчки идентичны.
Выкидываем 3- ю и получаем то что нужно.

Оффлайн ziv

  • Активист
  • *
  • Сообщений: 403
    • Просмотр профиля
Re: Найти одинаковые строки в файле!
« Ответ #5 : 09 Июля 2008, 13:38:06 »
Ну вот как-то так.
#! /usr/bin/perl -w

if( !$ARGV[0] ) {
die "Usage: $0 <file>\n";
}

open FILE, $ARGV[0] or die "Can't open $ARGV[0]: $!\n";
while(<FILE>) {
push @old, $_;
}
close FILE;
unlink $ARGV[0];

for($i=0; $i<@old; $i++) {
push @new, $old[$i];

if( $i ) {
$del=0;

for($j=0; $j<@new-1; $j++) {
if( !$del && $old[$i] eq $new[$j] ) { $del=1; }
}

if( $del ) { pop @new; }
}
}

open FILE, ">$ARGV[0]" or die "Can't open $ARGV[0]: $!\n";
print FILE @new;
close FILE;
« Последнее редактирование: 09 Июля 2008, 14:13:36 от ziv »

Оффлайн lumen_xp

  • Автор темы
  • Новичок
  • *
  • Сообщений: 24
    • Просмотр профиля
Re: Найти одинаковые строки в файле!
« Ответ #6 : 09 Июля 2008, 14:06:52 »
Благодарю господа.
Обязательно протестю в начале следущего дня.

Оффлайн ziv

  • Активист
  • *
  • Сообщений: 403
    • Просмотр профиля
Re: Найти одинаковые строки в файле!
« Ответ #7 : 09 Июля 2008, 14:14:00 »
Обрати внимание, я только что подредактировал.
Да... и сделай бэкап предварительно :)
« Последнее редактирование: 09 Июля 2008, 14:49:19 от ziv »

Оффлайн S.Tokarev

  • Активист
  • *
  • Сообщений: 415
    • Просмотр профиля
Re: Найти одинаковые строки в файле!
« Ответ #8 : 09 Июля 2008, 15:11:42 »
Цитировать
Обрати внимание, я только что подредактировал.
Да... и сделай бэкап предварительно
Так... Второй враг юникса себя обнаружил.
Я даже рекламу придумал такому решению: "Г%вно-софт! Теперь и под Линукс!" :)

А вот вменяемое решение.
Пишем в файл unify.pl следующее
#!/usr/bin/perl

my %wtf = ();

while(<STDIN>) {
  if (!defined($wtf{$_})) {
    print $_;
    $wtf{$_} = 1;
  }
}
Делаем его исполняемым один раз навсегда (а вдруг?)
chmod 755 ./unify.pl
Запускать надо так
./unify.pl < input_file
а если в файл надо результат сохранять, то
./unify.pl < input_file > output_file

Оффлайн ziv

  • Активист
  • *
  • Сообщений: 403
    • Просмотр профиля
Re: Найти одинаковые строки в файле!
« Ответ #9 : 09 Июля 2008, 15:18:07 »
Цитировать
Обрати внимание, я только что подредактировал.
Да... и сделай бэкап предварительно
Так... Второй враг юникса себя обнаружил.
Я даже рекламу придумал такому решению: "Г%вно-софт! Теперь и под Линукс!" :)

Хехе. А я так старался :)

Оффлайн S.Tokarev

  • Активист
  • *
  • Сообщений: 415
    • Просмотр профиля
Re: Найти одинаковые строки в файле!
« Ответ #10 : 09 Июля 2008, 15:28:44 »
Цитировать
Обрати внимание, я только что подредактировал.
Да... и сделай бэкап предварительно
Так... Второй враг юникса себя обнаружил.
Я даже рекламу придумал такому решению: "Г%вно-софт! Теперь и под Линукс!" :)

Хехе. А я так старался :)
А теперь представь как твоему скрипту в паре с процессором придётся стараться на файле из пары тысяч строк (с ~50% уникальностью).

Оффлайн ziv

  • Активист
  • *
  • Сообщений: 403
    • Просмотр профиля
Re: Найти одинаковые строки в файле!
« Ответ #11 : 09 Июля 2008, 15:31:54 »
Цитировать
Обрати внимание, я только что подредактировал.
Да... и сделай бэкап предварительно
Так... Второй враг юникса себя обнаружил.
Я даже рекламу придумал такому решению: "Г%вно-софт! Теперь и под Линукс!" :)

Хехе. А я так старался :)
А теперь представь как твоему скрипту в паре с процессором придётся стараться на файле из пары тысяч строк (с ~50% уникальностью).

Да, согласен. Идея с хэшем мне в голову не пришла.

Оффлайн Bers

  • Любитель
  • *
  • Сообщений: 60
    • Просмотр профиля
    • Домашняя страничка
Re: Найти одинаковые строки в файле!
« Ответ #12 : 09 Июля 2008, 18:31:30 »
или можно на питоне :)
#!/usr/bin/env python
wr = open('out.txt', 'w')
map(wr.write, set(open('in.txt', 'r').xreadlines()))

in.txt - входящий файл
out.txt - результат

Оффлайн Yurror

  • Старожил
  • *
  • Сообщений: 1966
    • Просмотр профиля
Re: Найти одинаковые строки в файле!
« Ответ #13 : 09 Июля 2008, 19:30:07 »
Раз выкладываем на разных языках
Код: ("destinct.cpp") [Выделить]
#include <iostream>
#include <map>

int main(int argc, char** argv) {
    std::string str;
    std::map<std::string, int> str_map;
    while (getline(std::cin, str)) {
        int& ref = str_map[str];
        if (!ref) {
            std::cout << str << std::endl;
            ref = 1;
        }
    }
    return (EXIT_SUCCESS);
}
хочу предупредить что  реализация тормозная до нельзя :)

Оффлайн igel

  • Новичок
  • *
  • Сообщений: 41
    • Просмотр профиля
Re: Найти одинаковые строки в файле!
« Ответ #14 : 09 Июля 2008, 23:17:36 »
Цитировать
хочу предупредить что  реализация тормозная до нельзя :)

Неужели тормознее perl-а? Это не попытка обидеть perl, просто любопытство. Обычно на низкоуровневых языках получается быстрее. Впрочем, мой опыт из области вычислений, а не обработки текста.

 

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