更改格式并合并2列中的信息



第一次在这里发帖,请耐心等待!

我有一个看起来像这样的文件:

POS {ALLELE:COUNT}  
1   G:27    A:11
2   C:40    T:0
3   C:40    A:0
4   T:40    G:0
5   G:0 C:40
6   C:40    T:0
7   G:24    A:14
8   G:40    A:0
9   A:40    G:0
...

我想将来自第二列和第三列的每一行的信息组合成以下格式:;数字[A]、数字[C]、数字[G]、数字[T]";所以上面的例子看起来是这样的:

POS {ALLELE:COUNT}
1   11,0,27,0
2   0,40,0,0
3   0,40,0,0
4   0,0,0,40
5   0,40,0,0
6   0,40,0,0
7   14,0,24,0
8   0,0,40,0
9   40,0,0,0
...

任何关于我如何做到这一点的想法都将不胜感激!

这里有一个有效的方法:

lines = open('test.txt','r').read().splitlines()
place = {'A':0,'C':1,'G':2,'T':3}
counts = [[0 for _ in range(4)] for _ in range(len(lines[1:]))]
for i,row in enumerate(lines[1:]):
for ct in row.split()[1:]:
a,b = ct.split(':')
counts[i][place[a]] = int(b)
out_str = 'n'.join([lines[0]] + ['{:<4}{},{},{},{}'.format(i+1,*ct) 
for i,ct in enumerate(counts)])
with open('output.txt','w') as f:
f.write(out_str)

生成的文件读取

POS {ALLELE:COUNT}  
1   11,0,27,0
2   0,40,0,0
3   0,40,0,0
4   0,0,0,40
5   0,40,0,0
6   0,40,0,0
7   14,0,24,0
8   0,0,40,0
9   40,0,0,0

我假设您的文件是常规的文本文件(不是csv或分隔文件(,并且G:27 A:11是该文本文件的一行。对于每一行,您可以执行以下操作(我们将以第一行为例(:使用strip删除无用空间G:27 A:11.strip()在黑空间上给出G:27 A:11,然后给出split,得到['G:27','A:11']。然后对该列表中的每个元素在:上进行分割,以获得等位基因类型及其计数。加在一起,它看起来像

resulting_table=[]
for line in file: #You can easily find how to read a file line by line
split_line=line.strip().split(' ')
A,T,G,C=0,0,0,0
for pair in split_line:
element=pair.split(':')
if element[0]=='A':
A=element[1]
elif element[0]=='T':
...
resulting_table.append([A,T,G,C])

给你!然后,您可以轻松地将其转换为数据帧或numpy数组

这绝对不是获得所需输出的最高效、最优雅的方式,但对于python初学者来说,这是清晰易懂的

sourse.txt

POS {ALLELE:COUNT}
1   G:27    A:11
2   C:40    T:0
3   C:40    A:0
4   T:40    G:0
5   G:0 C:40
6   C:40    T:0
7   G:24    A:14
8   G:40    A:0
9   A:40    G:0
import re
template = ('A', 'C', 'G', 'T')

def proc_line(line: str):

index, *elements = re.findall(r'S+', line)

data = dict([*map(lambda x: x.split(':'), elements)])

return f'{index}t' + ','.join([data.get(item, '0') for item in template]) + 'n'

with open('source.txt', encoding='utf-8') as file:
header, *lines = file.readlines()
with open('output.txt', 'w', encoding='utf-8') as new_file:
new_file.writelines(
[header] + list(map(proc_line, lines))
)

output.txt

POS {ALLELE:COUNT}  
1   11,0,27,0
2   0,40,0,0
3   0,40,0,0
4   0,0,0,40
5   0,40,0,0
6   0,40,0,0
7   14,0,24,0
8   0,0,40,0
9   40,0,0,0
$ awk -F'[ :]+' '
NR>1 {
delete f
f[$2] = $3
f[$4] = $5
$0 = sprintf("%s   %d,%d,%d,%d", $1, f["A"], f["C"], f["G"], f["T"])
}
1' file
POS {ALLELE:COUNT}
1   11,0,27,0
2   0,40,0,0
3   0,40,0,0
4   0,0,0,40
5   0,40,0,0
6   0,40,0,0
7   14,0,24,0
8   0,0,40,0
9   40,0,0,0

最新更新