LinuxForum.Fans
Тема

Как сделать сложную выборку из файла

Автор: valet 5 сообщений 3752 просмотров
#297177

Имеется файл:

Показать
100-plaginov-adobe-photoshop-1358318344.html
100-plaginov-adobe-photoshop-1358318345.html
100-plaginov-adobe-photoshop-1358352030.html
100-plaginov-adobe-photoshop-1358352031.html
100-plaginov-adobe-photoshop-1358415881.html
100-plaginov-adobe-photoshop-1358415883.html
100-plaginov-adobe-photoshop-1358448889.html
oficialnoe-rukovodstvo-po-photoshop-cs5-na-russkom-yazyke-1358283088.html
oficialnoe-rukovodstvo-po-photoshop-cs5-na-russkom-yazyke-1358283089.html
oficialnoe-rukovodstvo-po-photoshop-cs5-na-russkom-yazyke-1358294248.html
oficialnoe-rukovodstvo-po-photoshop-cs5-na-russkom-yazyke-1358294249.html
oficialnoe-rukovodstvo-po-photoshop-cs5-na-russkom-yazyke-1358300856.html
oficialnoe-rukovodstvo-po-photoshop-cs5-na-russkom-yazyke-1358300858.html
oficialnoe-rukovodstvo-po-photoshop-cs5-na-russkom-yazyke-1358335321.html
osnovy-photoshop-s-nulya-ot-a-do-ya-videokurs-1358248501.html
osnovy-photoshop-s-nulya-ot-a-do-ya-videokurs-1358248503.html
osnovy-photoshop-s-nulya-ot-a-do-ya-videokurs-1358282469.html
osnovy-photoshop-s-nulya-ot-a-do-ya-videokurs-1358282471.html
osnovy-photoshop-s-nulya-ot-a-do-ya-videokurs-1358298131.html
osnovy-photoshop-s-nulya-ot-a-do-ya-videokurs-1358298132.html
osnovy-photoshop-s-nulya-ot-a-do-ya-videokurs-1358335005.html

Нужно из этого файла выбрать к примеру:

text
100-plaginov-adobe-photoshop-1358318344.html
oficialnoe-rukovodstvo-po-photoshop-cs5-na-russkom-yazyke-1358283088.html
osnovy-photoshop-s-nulya-ot-a-do-ya-videokurs-1358248501.html

То есть только по одному экземпляру (можно по любому из однотипных).

Формат строки такой:
<имя файла>-<timestamp(это 10 цифр)>.html

по имени файла надо бы сделать что-то вроде sort -u, но как это сделать к части...

Пока что моих познаний не хватает это реализовать, просьба помочь.

#297178

Уже как бы идею понял, но по странной причине все равно не работает.
Идея: ведь можно использовать тот же sort -u (это же как бы удаляет дубли) с сортировкой по полю. То есть задача сводится в простановке разделителя в нужное место -а это же эелементарно sed'ом можно сделать.

Показать
$ cat test
100-plaginov-adobe-photoshop-1358318344.html
100-plaginov-adobe-photoshop-1358318345.html
100-plaginov-adobe-photoshop-1358352030.html
100-plaginov-adobe-photoshop-1358352031.html
100-plaginov-adobe-photoshop-1358415881.html
100-plaginov-adobe-photoshop-1358415883.html
100-plaginov-adobe-photoshop-1358448889.html
oficialnoe-rukovodstvo-po-photoshop-cs5-na-russkom-yazyke-1358283088.html
oficialnoe-rukovodstvo-po-photoshop-cs5-na-russkom-yazyke-1358283089.html
oficialnoe-rukovodstvo-po-photoshop-cs5-na-russkom-yazyke-1358294248.html
oficialnoe-rukovodstvo-po-photoshop-cs5-na-russkom-yazyke-1358294249.html
oficialnoe-rukovodstvo-po-photoshop-cs5-na-russkom-yazyke-1358300856.html
oficialnoe-rukovodstvo-po-photoshop-cs5-na-russkom-yazyke-1358300858.html
oficialnoe-rukovodstvo-po-photoshop-cs5-na-russkom-yazyke-1358335321.html
osnovy-photoshop-s-nulya-ot-a-do-ya-videokurs-1358248501.html
osnovy-photoshop-s-nulya-ot-a-do-ya-videokurs-1358248503.html
osnovy-photoshop-s-nulya-ot-a-do-ya-videokurs-1358282469.html
osnovy-photoshop-s-nulya-ot-a-do-ya-videokurs-1358282471.html
osnovy-photoshop-s-nulya-ot-a-do-ya-videokurs-1358298131.html
osnovy-photoshop-s-nulya-ot-a-do-ya-videokurs-1358298132.html
osnovy-photoshop-s-nulya-ot-a-do-ya-videokurs-1358335005.html
$ cat test|sed -r 's~([0-9]+)\.html$~\|\1\.html~gi'|sort -t"|" -u -k1
100-plaginov-adobe-photoshop-|1358318344.html
100-plaginov-adobe-photoshop-|1358318345.html
100-plaginov-adobe-photoshop-|1358352030.html
100-plaginov-adobe-photoshop-|1358352031.html
100-plaginov-adobe-photoshop-|1358415881.html
100-plaginov-adobe-photoshop-|1358415883.html
100-plaginov-adobe-photoshop-|1358448889.html
oficialnoe-rukovodstvo-po-photoshop-cs5-na-russkom-yazyke-|1358283088.html
oficialnoe-rukovodstvo-po-photoshop-cs5-na-russkom-yazyke-|1358283089.html
oficialnoe-rukovodstvo-po-photoshop-cs5-na-russkom-yazyke-|1358294248.html
oficialnoe-rukovodstvo-po-photoshop-cs5-na-russkom-yazyke-|1358294249.html
oficialnoe-rukovodstvo-po-photoshop-cs5-na-russkom-yazyke-|1358300856.html
oficialnoe-rukovodstvo-po-photoshop-cs5-na-russkom-yazyke-|1358300858.html
oficialnoe-rukovodstvo-po-photoshop-cs5-na-russkom-yazyke-|1358335321.html
osnovy-photoshop-s-nulya-ot-a-do-ya-videokurs-|1358248501.html
osnovy-photoshop-s-nulya-ot-a-do-ya-videokurs-|1358248503.html
osnovy-photoshop-s-nulya-ot-a-do-ya-videokurs-|1358282469.html
osnovy-photoshop-s-nulya-ot-a-do-ya-videokurs-|1358282471.html
osnovy-photoshop-s-nulya-ot-a-do-ya-videokurs-|1358298131.html
osnovy-photoshop-s-nulya-ot-a-do-ya-videokurs-|1358298132.html
osnovy-photoshop-s-nulya-ot-a-do-ya-videokurs-|1358335005.html

Но как видим по непонятной мне причине оно не срабатывает - как это понимать?
При этом перемешивание строк работает:

Показать
$ cat test|sed -r 's~([0-9]+)\.html$~\|\1\.html~gi'|sort -t"|" -R -k1
100-plaginov-adobe-photoshop-|1358415883.html
100-plaginov-adobe-photoshop-|1358352030.html
osnovy-photoshop-s-nulya-ot-a-do-ya-videokurs-|1358298131.html
oficialnoe-rukovodstvo-po-photoshop-cs5-na-russkom-yazyke-|1358335321.html
oficialnoe-rukovodstvo-po-photoshop-cs5-na-russkom-yazyke-|1358294249.html
osnovy-photoshop-s-nulya-ot-a-do-ya-videokurs-|1358335005.html
oficialnoe-rukovodstvo-po-photoshop-cs5-na-russkom-yazyke-|1358300856.html
100-plaginov-adobe-photoshop-|1358415881.html
100-plaginov-adobe-photoshop-|1358318345.html
100-plaginov-adobe-photoshop-|1358448889.html
osnovy-photoshop-s-nulya-ot-a-do-ya-videokurs-|1358248501.html
100-plaginov-adobe-photoshop-|1358352031.html
osnovy-photoshop-s-nulya-ot-a-do-ya-videokurs-|1358282469.html
oficialnoe-rukovodstvo-po-photoshop-cs5-na-russkom-yazyke-|1358300858.html
100-plaginov-adobe-photoshop-|1358318344.html
oficialnoe-rukovodstvo-po-photoshop-cs5-na-russkom-yazyke-|1358294248.html
oficialnoe-rukovodstvo-po-photoshop-cs5-na-russkom-yazyke-|1358283088.html
osnovy-photoshop-s-nulya-ot-a-do-ya-videokurs-|1358298132.html
osnovy-photoshop-s-nulya-ot-a-do-ya-videokurs-|1358282471.html
osnovy-photoshop-s-nulya-ot-a-do-ya-videokurs-|1358248503.html
oficialnoe-rukovodstvo-po-photoshop-cs5-na-russkom-yazyke-|1358283089.html

Теперь другой вопрос - что я делаю не так? Что разве sort -u не удаляет дубли?

#297179

И все таки разобрался, может кому-то что-то подобное пригодится, поэтому опубликую тут решение.

Оказалось вот что (читать внимательно маны полезно :)) - ключ k для sort на самом деле не указывает на поле по которому надо сортировать

text
-k, --key=POS1[,POS2]
              start a key at POS1 (origin 1), end it at POS2 (default end of line)

То есть это позиция, с которой надо учитывать текст для сортировки, учитывая разделитель, то есть k1 вообще не будет иметь смысла - так как будет эквивалентно обычной сортировке.
Поэтому надо чтобы наше поле было не первым а вторым после разделителя и тогда использовать ключ -k2.


То есть задача сводится:
1. Прописать в нужном месте разделитель.
2. Переставить местами поля по разделителю - так чтобы поле по которому будем сортировать было не первым, а вторым.
3. Отсортировать с удалением дублей, начиная с позиции начала второго поля.
4. Переставить местами поля по разделителю - вернуть в исходное положение.
5. Удалить разделитель.

Вот на практике:

Показать
$ cat test
100-plaginov-adobe-photoshop-1358318344.html
100-plaginov-adobe-photoshop-1358318345.html
100-plaginov-adobe-photoshop-1358352030.html
100-plaginov-adobe-photoshop-1358352031.html
100-plaginov-adobe-photoshop-1358415881.html
100-plaginov-adobe-photoshop-1358415883.html
100-plaginov-adobe-photoshop-1358448889.html
oficialnoe-rukovodstvo-po-photoshop-cs5-na-russkom-yazyke-1358283088.html
oficialnoe-rukovodstvo-po-photoshop-cs5-na-russkom-yazyke-1358283089.html
oficialnoe-rukovodstvo-po-photoshop-cs5-na-russkom-yazyke-1358294248.html
oficialnoe-rukovodstvo-po-photoshop-cs5-na-russkom-yazyke-1358294249.html
oficialnoe-rukovodstvo-po-photoshop-cs5-na-russkom-yazyke-1358300856.html
oficialnoe-rukovodstvo-po-photoshop-cs5-na-russkom-yazyke-1358300858.html
oficialnoe-rukovodstvo-po-photoshop-cs5-na-russkom-yazyke-1358335321.html
osnovy-photoshop-s-nulya-ot-a-do-ya-videokurs-1358248501.html
osnovy-photoshop-s-nulya-ot-a-do-ya-videokurs-1358248503.html
osnovy-photoshop-s-nulya-ot-a-do-ya-videokurs-1358282469.html
osnovy-photoshop-s-nulya-ot-a-do-ya-videokurs-1358282471.html
osnovy-photoshop-s-nulya-ot-a-do-ya-videokurs-1358298131.html
osnovy-photoshop-s-nulya-ot-a-do-ya-videokurs-1358298132.html
osnovy-photoshop-s-nulya-ot-a-do-ya-videokurs-1358335005.html
$ cat test|sed -r 's~([0-9]+)\.html$~\|\1\.html~gi'|sed -r 's~([^\|]+)\|(.*)~\2\|\1~gi'|sort -t"|" -u -k2|sed -r 's~([^\|]+)\|(.*)~\2\|\1~gi'|sed -r 's~\|~~gi'
100-plaginov-adobe-photoshop-1358318344.html
oficialnoe-rukovodstvo-po-photoshop-cs5-na-russkom-yazyke-1358283088.html
osnovy-photoshop-s-nulya-ot-a-do-ya-videokurs-1358248501.html

То есть все работает!
Может можно как-то и проще (в чем я сомневаюсь), но для меня сейчас главное что это работает!

#297203
"valet" написал:
$ cat test|sed -r 's~([0-9]+)\.html$~\|\1\.html~gi'|sed -r 's~([^\|]+)\|(.*)~\2\|\1~gi'|sort -t"|" -u -k2|sed -r 's~([^\|]+)\|(.*)~\2\|\1~gi'|sed -r 's~\|~~gi'

OMG! :D
В sed и bash я не силён, но, ИМХО, так "человечнее":

text

$ for z in `sed -r 's/\-[0-9]{10}\.html//' file.txt | uniq`; do grep -m 1 $z file.txt; done;
#297470

-=Serj=-, можно и так, вот только работать мне кажется будет медленнее из-за конструкции for.. in

Да, кстати сейчас проверил. На очень большом файле вариант от -=Serj=- к сожалению работает ужастно медленно, а оно и логично: в моем варианте сложность обработки - это несколько обработок входного файла sed'ами, а в варианте от -=Serj=- что мы имеем: мы получаем нужные уникальные куски строк (заметим что этих кусков при большом файле огромное количество, порядок которых измеряется количеством строк в файле), а потом делаем выборки из входного файла для каждой этой строки - вы представляете что будет творится если в файле миллионы строк - сложность выполнения будет равна выполнению миллионов скриптов над и так огромным файлом.
Так что вариант то рабочий, но "человечнее" он только визуально и фактически непригодный для выполнения в реальных условиях.

Войдите или зарегистрируйтесь, чтобы ответить.