URL: https://www.opennet.me/cgi-bin/openforum/vsluhboard.cgi
Форум: vsluhforumID9
Нить номер: 7789
[ Назад ]

Исходное сообщение
"быстро взять новые строки"

Отправлено Kurk_SS , 22-Дек-08 17:28 
есть два файла новый и старый... в каждом по 1000 строк гдето...

коким методом можно быстро получить список строк которые есть в новом но отсутствуют в старом?

строки которые есть в старом но нету в новом не интересуют. эти строки - это имена файлов, вот чтоб не качать файлы заново все, имея списка два выбрать те что появились.
олько вот что ешо. Список файлов это насомом деле строки где через "," много чего, имя файла во второй позиции...

у меня вариан был только реализовать чтото не получаеться....
всмысле мысли в голове путаються

less file.new | awk -F, '{print $2}' > .new
less file.old | awk -F, '{print $2}' > .old

sed ..... .old > old старый файл пропустить через сед, чтобы он из "имя" --> "/имя/d"                                                                                 получили файл команд для седа на удаление таких строк
sed -f old .new пропустить через сед указав в качестве скрипта модиф. стар. файл
получить нужный список.

всё хорошо только вот в именах файла есть точка которую нужно както экранировать и както довставить слеши


Содержание

Сообщения в этом обсуждении
"быстро взять новые строки"
Отправлено Pahanivo , 22-Дек-08 17:36 
нихеранепонятночетысказалномывседружнопосочуствовалиможетвследущийразтыхотябыудосужишсьяпривестипримерыфайлов



"быстро взять новые строки"
Отправлено Kurk_SS , 22-Дек-08 22:57 
>нихеранепонятночетысказалномывседружнопосочуствовалиможетвследущийразтыхотябыудосужишсьяпривестипримерыфайлов

:)
не буду грузить своими вариантами просто задача....

структура этих файлов

id_clip,file_name.avi,flag,count,prefix,postfix,date,time,limit,ok
и таких под 1000 строк, имена файлов(file_name.avi) нас и интересуют.
вот папка с файлами авишками, сопровождаеться файлом описания, его структура выше.

есть машина1, на ней обновленный контент, тоесть есть новые авишки и соответствующие строки в файле описании.
есть машина два - на ней тоже самое но не обновленное, связь между машинами, мои ноги и флэшка:)
так вот, мне нужно имея файл описания со второй машины(стаый файл) и с первой(новый файл)
сформировать список роликов которые есть на первой машине, но ешо нету на второй, шоб флэшкой их туда отнести.



"быстро взять новые строки"
Отправлено angra , 22-Дек-08 23:05 
Ну ведь вроде все команды уже подсказали, неужели так лениво маны глянуть
awk -F "," '{print $2}' list_old| sort> list_names_old
awk -F "," '{print $2}' list_new| sort> list_names_new
for i in $(comm -1 -3 list_names_old list_names_new); do cp "$i" /path/to/flash/; done


"быстро взять новые строки"
Отправлено vic , 23-Дек-08 03:35 
>Ну ведь вроде все команды уже подсказали, неужели так лениво маны глянуть
>
>awk -F "," '{print $2}' list_old| sort> list_names_old
>awk -F "," '{print $2}' list_new| sort> list_names_new
>for i in $(comm -1 -3 list_names_old list_names_new); do cp "$i" /path/to/flash/;
>done

Кстати, еще есть утилита cut, таким образом первые две строки в этом решении могут быть такими:
cut -d',' -f2 list_old | sort -u > list_names_old
cut -d',' -f2 list_new | sort -u > list_names_new

ну это уже дело вкуса конечно :)

ЗЫ автору топика, судя по всему файлы в формате CSV, т.е. достаточно было сказать об этом в самом начале, на будущее почитайте http://en.wikipedia.org/wiki/Comma-separated_values и обратите внимание на ссылку на rfc. Очень распространенный формат однако ;)


"быстро взять новые строки"
Отправлено Kurk_SS , 23-Дек-08 11:02 
>>Ну ведь вроде все команды уже подсказали, неужели так лениво маны глянуть

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

а вообще и польза есть, вот про КАТ узнал...
вот только одно интерестно ... зачем -1 -3 флаги.... ведь третья колонка это строки которые есть и там и там, а мне нужно только -2... колонка строк, которые есть только во втором файле.... или я что-то путаю?



"быстро взять новые строки"
Отправлено vic , 23-Дек-08 22:08 
>[оверквотинг удален]
>
>не лень, и глянул... точнее знал даже про комм... из головы вылетела,
>а просто несмог без ответа оставить человека с чувством юмора, которому
>задача не ясна.
>
>а вообще и польза есть, вот про КАТ узнал...
>вот только одно интерестно ... зачем -1 -3 флаги.... ведь третья колонка
>это строки которые есть и там и там, а мне нужно
>только -2... колонка строк, которые есть только во втором файле.... или
>я что-то путаю?

cat и cut это две разные утилиты :)

флаги для comm говорят не какие строки выводить, а какие строки подавлять.

ps скорость для файла в 1000 строк мерить смысла нет, разница на уровне погрешности измерения, вот если там будет 1Gb данных, тогда будет заметно.


"быстро взять новые строки"
Отправлено Kurk_SS , 23-Дек-08 11:06 
кстате я говорил ещё оскорости работы... вообщем хочу реализовать все варианты

awk sort comm
cat sort comm
awk (for string in newfile grep oldfile)
кстате никто не подскажет, хотелось бы и с седом вариант попробовать
как седом это всё сделать
тоесть из старого файла сделать набор правил на удаление строк по шаблону, и потом новый файл прогнать по этим правилам, результат остануться одни "новинки.ави"

результаты теста скорости потом напишу :)


"быстро взять новые строки"
Отправлено angra , 24-Дек-08 18:10 
Если вам хочется извращаться, то пожалуйста, делайте в свое удовольствие, зачем только других этим озадачивать. Кстати ваша идея с sed на редкость идиотская.

"быстро взять новые строки"
Отправлено Hetzer , 22-Дек-08 17:38 
>есть два файла новый и старый... в каждом по 1000 строк гдето...
>
>
>коким методом можно быстро получить список строк которые есть в новом но
>отсутствуют в старом?
>

man comm


"взяли брёвнышко, весело понесли"
Отправлено Andrey Mitrofanov , 22-Дек-08 18:03 
>>коким методом можно быстро получить список строк которые есть в новом но
>>отсутствуют в старом?
>man comm

Пример для :))) плаги^Wподражания: http:/openforum/vsluhforumID3/46819.html#5 , там, где строка с comm.