Можно ли найти файл для шаблона, а затем отсортировать найденные строки в соответствии с частью шаблона? - PullRequest
2 голосов
/ 14 июля 2011

Я храню несколько индивидуально сериализованных массивов PHP в файл.Каждая строка файла содержит один сериализованный массив.Например:

a:2:{s:4:"name";s:8:"John Doe";s:3:"age";s:2:"20";}
a:2:{s:4:"name";s:8:"Jane Doe";s:3:"age";s:2:"15";}
a:2:{s:4:"name";s:12:"Steven Tyler";s:3:"age";s:2:"35";}
a:2:{s:4:"name";s:12:"Jim Morrison";s:3:"age";s:2:"25";}
a:2:{s:4:"name";s:13:"Apple Paltrow";s:3:"age";s:2:"75";}
a:2:{s:4:"name";s:12:"Drew Nickels";s:3:"age";s:2:"34";}
a:2:{s:4:"name";s:11:"Jason Proop";s:3:"age";s:2:"36";}

Вот мой вопрос:

Можно ли выполнить поиск этого файла для следующего шаблона: "name"*"*"

После этого я бы хотелотсортировать найденные строки на основе содержимого второго подстановочного знака.

Ответы [ 2 ]

3 голосов
/ 15 июля 2011

Я не уверен, в каком месте это происходит, так как все ваши строки, кажется, соответствуют шаблону.Но в любом случае, вы можете использовать sort для сортировки образца ввода:

sort -t\" -k4 data.txt

Он игнорирует «реальную» структуру текста, он просто обрабатывает " как разделитель, поэтомубыстро и грязно, но сортирует как хочешь.Вот оно в действии:

http://ideone.com/ZugIX

Если вам нужно выполнить grep для "name".*".*", вы можете сначала сделать это и направить вывод в команду sort.

3 голосов
/ 15 июля 2011

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

> cat data.txt
a:2:{s:4:"name";s:8:"John Doe";s:3:"age";s:2:"20";}
a:2:{s:4:"name";s:8:"Jane Doe";s:3:"age";s:2:"15";}
a:2:{s:4:"name";s:12:"Steven Tyler";s:3:"age";s:2:"35";}
a:2:{s:4:"name";s:12:"Jim Morrison";s:3:"age";s:2:"25";}
a:2:{s:4:"name";s:13:"Apple Paltrow";s:3:"age";s:2:"75";}
a:2:{s:4:"name";s:12:"Drew Nickels";s:3:"age";s:2:"34";}
a:2:{s:4:"name";s:11:"Jason Proop";s:3:"age";s:2:"36";}

Теперь мы будем использовать команду «sed», чтобы извлечь имя с помощью регулярного выражения.Затем мы выводим имя, вкладку, а затем исходную строку, чтобы мы могли ее отсортировать:

> cat data.txt | sed -rn 's/[^"]+"name";s:[0-9]+:"([^"]+)".*/\1\t\0/p'
John Doe        a:2:{s:4:"name";s:8:"John Doe";s:3:"age";s:2:"20";}
Jane Doe        a:2:{s:4:"name";s:8:"Jane Doe";s:3:"age";s:2:"15";}
Steven Tyler    a:2:{s:4:"name";s:12:"Steven Tyler";s:3:"age";s:2:"35";}
Jim Morrison    a:2:{s:4:"name";s:12:"Jim Morrison";s:3:"age";s:2:"25";}
Apple Paltrow   a:2:{s:4:"name";s:13:"Apple Paltrow";s:3:"age";s:2:"75";}
Drew Nickels    a:2:{s:4:"name";s:12:"Drew Nickels";s:3:"age";s:2:"34";}
Jason Proop     a:2:{s:4:"name";s:11:"Jason Proop";s:3:"age";s:2:"36";}

Эта команда sed требует, чтобы значение 'name' было первой строкой в ​​кавычках в строке.Если вы не можете гарантировать, что вам, вероятно, следует реализовать этот шаг с помощью php-скрипта и десериализовать данные, используя встроенные функции php.Если имя отсутствует или это не первая строка в кавычках в строке, строка будет пропущена.Для получения дополнительной информации о sed есть много ресурсов в сети.

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

> cat data.txt | sed -rn 's/[^"]+"name";s:[0-9]+:"([^"]+)".*/\1\t\0/p' | sort
Apple Paltrow   a:2:{s:4:"name";s:13:"Apple Paltrow";s:3:"age";s:2:"75";}
Drew Nickels    a:2:{s:4:"name";s:12:"Drew Nickels";s:3:"age";s:2:"34";}
Jane Doe        a:2:{s:4:"name";s:8:"Jane Doe";s:3:"age";s:2:"15";}
Jason Proop     a:2:{s:4:"name";s:11:"Jason Proop";s:3:"age";s:2:"36";}
Jim Morrison    a:2:{s:4:"name";s:12:"Jim Morrison";s:3:"age";s:2:"25";}
John Doe        a:2:{s:4:"name";s:8:"John Doe";s:3:"age";s:2:"20";}
Steven Tyler    a:2:{s:4:"name";s:12:"Steven Tyler";s:3:"age";s:2:"35";}

Теперьнаши строки отсортированы, нам просто нужно избавиться от простых имен в начале строк:

> cat data.txt | sed -rn 's/[^"]+"name";s:[0-9]+:"([^"]+)".*/\1\t\0/p' | sort | cut -f2
a:2:{s:4:"name";s:13:"Apple Paltrow";s:3:"age";s:2:"75";}
a:2:{s:4:"name";s:12:"Drew Nickels";s:3:"age";s:2:"34";}
a:2:{s:4:"name";s:8:"Jane Doe";s:3:"age";s:2:"15";}
a:2:{s:4:"name";s:11:"Jason Proop";s:3:"age";s:2:"36";}
a:2:{s:4:"name";s:12:"Jim Morrison";s:3:"age";s:2:"25";}
a:2:{s:4:"name";s:8:"John Doe";s:3:"age";s:2:"20";}
a:2:{s:4:"name";s:12:"Steven Tyler";s:3:"age";s:2:"35";}

Наслаждайтесь!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...