Инструменты для разбора файла командной строки в cygwin - PullRequest
0 голосов
/ 17 сентября 2008

Мне приходится иметь дело с текстовыми файлами в пестром выборе форматов. Вот пример (столбцы A и B разделены табуляцией):

A   B
a   Name1=Val1, Name2=Val2, Name3=Val3
b   Name1=Val4, Name3=Val5
c   Name1=Val6, Name2=Val7, Name3=Val8

Файлы могут иметь заголовки или нет, иметь смешанные схемы разделения, иметь столбцы с парами имя / значение, как указано выше и т. Д.
У меня часто возникает необходимость извлекать данные из таких файлов различными способами. Например, из приведенных выше данных мне может потребоваться значение, связанное с Name2, где оно присутствует. т.е.

A   B
a   Val2
c   Val7

Какие существуют инструменты / методы для выполнения таких манипуляций, как однострочные команды, используя приведенное выше в качестве примера, но распространяемое на другие случаи?

Ответы [ 6 ]

1 голос
/ 17 сентября 2008

Я не очень люблю sed, но он работает для таких вещей:

var="Name2";sed -n "1p;s/\([^ ]*\) .*$var=\([^ ,]*\).*/\1 \2/p" < filename

Дает вам:

 A B
 a Val2
 c Val7
1 голос
/ 17 сентября 2008

В вашем распоряжении все основные команды оболочки bash, например, grep, cut, sed и awk. Вы также можете использовать Perl или Ruby для более сложных вещей.

0 голосов
/ 17 сентября 2008

Я бы использовал Perl. Напишите небольшой модуль (или более одного) для работы с различными форматами. Затем вы можете запустить Perl Oneliners, используя эту библиотеку. Пример для чего бы это выглядеть следующим образом:

perl -e 'use Parser;' -e 'parser("in.input").get("Name2");'

Не цитируйте меня по синтаксису, но это общая идея. Абстрагируйся от поставленной задачи, чтобы ты мог думать о том, что тебе нужно делать, а не о том, как тебе нужно это делать Ruby был бы другим вариантом, он обычно имеет более чистый синтаксис, но любой язык работал бы.

0 голосов
/ 17 сентября 2008

Поскольку у вас есть Cygwin, я бы пошел с Perl. Его легче всего изучить (см. Книгу O'Reily: Learning Perl ) и широко применимы.

0 голосов
/ 17 сентября 2008

Я бы использовал sed:

   # print section of file between two regular expressions (inclusive)
   sed -n '/Iowa/,/Montana/p'             # case sensitive
0 голосов
/ 17 сентября 2008

Из того, что я видел, я бы начал с Awk для такого рода вещей, а затем, если вам понадобится что-то более сложное, я перейду к Python.

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