2010-01-13 2 views
0

У меня есть текстовый файл с большим количеством строк и с этой структурой:Awk, bash или python для преобразования обычного файла?

[('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.

Благодаря

Хосе

+0

почему это закрывается как субъективные и аргументированный? – SilentGhost

+0

, что я имею в виду, что самый простой подход, простой в understan d другим программистом – asdf

+0

Просто пища для размышлений: 'json.loads (data.replace ('(', '[') .replace (')', ']'))' - предполагается, что (и) не находятся в вашем данные. – gahooa

ответ

1

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

+0

, хотя это, кажется, Python, неясно, как вы можете импортировать контент. – SilentGhost

+0

После небольшого изменения. Скажем, вы можете поставить 'foo =' перед всем этим? –

0

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

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

«AWK является языком для обработки файлов текста. Файл обрабатывается как последовательности записей, и по умолчанию каждая строка представляет собой запись. Каждая строка разбивается на последовательность полей , таким образом, мы можем думать о первом слове в линии, как первое поле, второе слова в качестве второго поля, и так далее. программы AWK имеет последовательность шаблон-действие. AWK читает ввод строки за раз. Линия отсканирована для каждого шаблона в pr ogram, и для каждого шаблона, который соответствует , соответствующее действие выполнено в . " - Alfred V. Aho [2]

2

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

eval(your_string) 

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

+1

Если ваши данные начинаются, как вы говорите, возможно, вы захотите добавить к нему «data =». Вы можете сделать это динамически в python или отредактировать файл. Это означает, что вы сможете получить к нему доступ, а не просто анализировать его в эфире. – Oli

0

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

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

+0

Если бы он спрашивал «Python, perl или Ruby», я определенно согласился бы с вами. Но awk, bash и Python - это три языка, которые существенно различаются по своим возможностям и в том, что им удобно делать. – Omnifarious

2

Я хотел бы использовать 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 
0

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

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() довольно противоречиво, поскольку оно выполнит любой действительный код python, который вы передадите в него, поэтому будьте осторожны.

1

О мальчик, здесь работа для ast.literal_eval: (literal_eval безопаснее, чем eval, поскольку он ограничивает входной строки литералов, такие как строки, числа, кортежи, списки, dicts, булевы и 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

вот один из способов сделать это с (г) 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 
Смежные вопросы