Awk, Bash или Python для преобразования обычного файла? - PullRequest
0 голосов
/ 13 января 2010

У меня есть текстовый файл с множеством строк и с такой структурой:

[('name_1a',
'name_1b',
value_1),
('name_2a',
'name_2b',
value_2),
.....
.....
('name_XXXa',
'name_XXXb',
value_XXX)]

Я хотел бы преобразовать его в:

name_1a, name_1b, value_1
name_2a, name_2b, value_2
......
name_XXXa, name_XXXb, value_XXX

Интересно, что было бы лучше, будь то awk, python или bash.

Спасибо

Jose

Ответы [ 8 ]

2 голосов
/ 13 января 2010

Я хотел бы использовать Python:

lines = open('filename.txt','r').readlines()
n = len(lines) # n % 3 == 0
for i in range(0,n,3):
    name1 = lines[i].strip("',[]\n\r")
    name2 = lines[i+1].strip("',[]\n\r")
    value = lines[i+2].strip("',[]\n\r")
    print name1,name2,value
2 голосов
/ 13 января 2010

Пробовал оценивать это python? Выглядит как список кортежей для меня.

eval(your_string)

Обратите внимание, это небезопасно! Если там есть код для удаления вашего жесткого диска, при оценке он запустит этот код!

1 голос
/ 13 января 2010

вот один из способов сделать это с (g) awk

$ awk -vRS=")," ' { gsub(/\n|[\047\]\[)(]/,"") } 1' file
name_1a,name_1b,value_1
name_2a,name_2b,value_2
name_XXXa,name_XXXb,value_XXX
1 голос
/ 13 января 2010

О, мальчик, вот работа для ast.literal_eval: (literal_eval безопаснее, чем eval, поскольку он ограничивает входную строку литералами, такими как строки, числа, кортежи, списки, слова, логические значения и None:

import ast
filename='in'
with open(filename,'r') as f:
    contents=f.read()
    data=ast.literal_eval(contents)

for elt in data:
    print(', '.join(map(str,elt)))
1 голос
/ 13 января 2010

Похоже на легальный Python.Вы можете импортировать его как модуль, а затем записать обратно после форматирования.

0 голосов
/ 13 января 2010

Если значения являются допустимыми значениями Python, вы можете воспользоваться функцией eval (), поскольку ваши данные являются допустимой логикой данных Python. Следующее будет работать, если значения целые, в противном случае вам, возможно, придется немного помассировать вызов print:

input = """[('name_1a',
          'name_1b',
          1),
         ('name_2a',
          'name_2b',
          2),
         ('name_XXXa',
          'name_XXXb',
          3)]"""

for e in eval(input):
    print '%s,%s,%d' % e

P.S. с помощью Eval () является весьма спорным, так как он будет выполнять любой действительный код питона, который вы передаете в него, так что будьте аккуратнее.

0 голосов
/ 13 января 2010

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

Поскольку это довольно простая задача, я бы предложил использовать то, что вы знаете (если вы не делаете это в учебных целях, в чем я сомневаюсь).
Если вы знаете какой-либо из предложенных вами языков, решите это за считанные минуты. Если вы не знаете ни одного из них, теперь входит в субъективную часть, я бы посоветовал изучать Python, так как это намного веселее, чем другие 2;)

0 голосов
/ 13 января 2010

Awk обычно ориентирован на строку, а bash - оболочка с ограниченным числом функций манипуляции со строками.Это действительно зависит от того, в чем заключается твоя сила как программиста, но при прочих равных условиях я бы выбрал python .

Ты когда-нибудь думал об этом, перенаправляя время, необходимое для публикациина SO, вы могли бы это сделать?

"AWK - это язык для обработки файлов текста. Файл обрабатывается как последовательность записей, и по умолчанию каждая строка является записью. Каждаястрока разбита на последовательность полей, поэтому мы можем рассматривать первое слово в строке как первое поле, второе слово как второе поле и т. д. Программа AWK состоит из последовательности операторов pattern-action. AWK читает входные данные по строке за раз. Строка сканируется для каждого шаблона в программе, и для каждого соответствующего шаблона выполняется соответствующее действие. "- Альфред В. Ахо [2]

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