我需要解析使用不同参数运行的化学程序的输出,并以特定格式组合感兴趣的信息。
该程序的每个输出文件如下表所示,它给出了特定pH下质子化和未质子化物种(残留物)的数量(此处pH = 0):
Residue Number State 0 State 1 State 2 State 3 State 4
-----------------------------------------------------------------------------------
Residue: GL4 7 0.000410 (0) 0.453512 (1) 0.004275 (1) 0.535908 (1) 0.005895 (1)
Residue: HIP 15 0.900000 (2) 0.080000 (1) 0.020000 (1)
Residue: AS4 18 0.010085 (0) 0.486042 (1) 0.004335 (1) 0.495922 (1) 0.003615 (1)
Residue: GL4 35 0.000000 (0) 0.581343 (1) 0.000360 (1) 0.368002 (1) 0.050295 (1)
Residue: AS4 48 0.022640 (0) 0.520073 (1) 0.018440 (1) 0.425152 (1) 0.013695 (1)
Residue: AS4 52 0.038725 (0) 0.517533 (1) 0.113676 (1) 0.280601 (1) 0.049465 (1)
Residue: AS4 66 1.000000 (0) 0.000000 (1) 0.000000 (1) 0.000000 (1) 0.000000 (1)
Residue: AS4 87 0.004295 (0) 0.439747 (1) 0.010535 (1) 0.524678 (1) 0.020745 (1)
Residue: AS4 101 0.000105 (0) 0.504673 (1) 0.013110 (1) 0.478517 (1) 0.003595 (1)
Residue: AS4 119 0.014240 (0) 0.488767 (1) 0.007100 (1) 0.483272 (1) 0.006620 (1)
对于每个pH,我有一个这样的文件(所有文件具有完全相同的残基和状态,只有种群变化)。现在我想提取所有残留物的去质子化部分。去质子化的部分对应于在其数目后具有(0)的群体:例如,在pH = 0的GL4 7的情况下,它是0.000410(其对应于状态0),对于AS4 66,它是1.00000。实际上,对于HIP 15,所有残基的状态都是0:在这种情况下,去质子化的部分用(1)表示并且对应于状态1和2.在上面的例子中,它是0.080000 + 0.020000 = 0.1。
然后我需要将来自不同文件的这些信息组合成一个文件,如下所示:
# pH GLU7 HIS15 ASP18 GLU35 ASP48 ASP52 ASP66 ASP87 ASP101 ASP119
0.000 0.000 0.100 0.010 0.000 0.023 0.039 1.000 0.004 0.000 0.014
1.000 0.006 0.140 0.098 0.000 0.276 0.312 1.000 0.015 0.002 0.069
每列对应一个残基,每行对应一个pH(即单个文件中的信息,这里我只显示两个文件中的信息)。
我试图提出一些awk单行,但我是初学者,我不知道如何继续。实际上,我不知道awk是否是这项工作的最佳工具。也许sed和grep或python会更好。 我将需要使用许多不同的输出进行多次解析(但是虽然残留物会发生变化,但它们看起来都一样)所以我想有办法让它自动化但具有一定的灵活性。
如果您有任何建议或意见,请不要犹豫,如果您能帮我解决这个问题,我将不胜感激。
非常感谢提前!
答案 0 :(得分:0)
您可以使用for循环将所有文件捕获到文件中,并使用Stackoverflow中的先前解决方案将行转置为列。
答案 1 :(得分:0)
它并不完全清楚你想要什么,但python的分裂功能可能对你有用。如果在没有任何参数的情况下调用它,它将根据空格分割(将多个空格整理为一个)
所以这一行,例如,
Residue: GL4 7 0.000410 (0) 0.453512 (1) 0.004275 (1) 0.535908 (1) 0.005895 (1)
可以像这样拆分,
a = 'Residue: GL4 7 0.000410 (0) 0.453512 (1) 0.004275 (1) 0.535908 (1) 0.005895 (1)'
l = a.split()
print l
['Residue:', 'GL4', '7', '0.000410', '(0)', '0.453512', '(1)', '0.004275', '(1)', '0.535908', '(1)', '0.005895', '(1)']
然后,您可以访问所需的值并对其进行处理。在字符串上调用float和int(例如float(' 0.00410')应该将它们转换为数字。对于'(1)',你可以做int(& #39;(1)' [1:-1])
答案 2 :(得分:0)
这个awk
脚本可以帮助您入门。为了获得所需的输出,您必须使用相应的pH值替换文件名。并且我省略了不包含零状态的行,因为您没有指定如何处理这些行。
/^ Residue/ || /^-----/ { next; }
{
filenames[FILENAME] = 1;
columns[$2 " " $3] = 1;
for (i = 5; i <= NF; i = i + 2) {
if ($i == "(0)") {
data[$2 " " $3, FILENAME] = $(i-1);
}
}
}
END {
printf("%10s", "filename");
for (col in columns) {
printf("%10s", col);
}
print "";
for (filename in filenames) {
printf("%10s", filename);
for (col in columns) {
printf("%10s", data[col, filename]);
}
print "";
}
}