Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/302.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/unix/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 查找文本列表并在匹配字段处替换_Python_Unix_Replace - Fatal编程技术网

Python 查找文本列表并在匹配字段处替换

Python 查找文本列表并在匹配字段处替换,python,unix,replace,Python,Unix,Replace,好吧,我承认这个标题对我的问题来说是模糊的,我不能用一种更容易理解的方式来表达。我是编程新手,我的专业术语还在发展中 我有两个文件,文件A看起来像: CHROM POS ID AGM12 AGM14 AGM15 AGM18 .. 1 14930 rs150145850 0/0 1/1 0/0 0/0 .. 1 14933 rs138566748 0/0 0/0 0/0 0/0 .. 1 63671 rs116440577 0/1 0/0 0/

好吧,我承认这个标题对我的问题来说是模糊的,我不能用一种更容易理解的方式来表达。我是编程新手,我的专业术语还在发展中

我有两个文件,文件
A
看起来像:

CHROM   POS ID  AGM12   AGM14   AGM15   AGM18 ..
1   14930   rs150145850     0/0 1/1 0/0  0/0 ..
1   14933   rs138566748 0/0 0/0 0/0  0/0 ..
1   63671   rs116440577 0/1 0/0 0/0  0/0 ..
2   808922  rs6594027   0/0 0/0 0/0  0/1 ..
2   753474  rs2073814   1/0 0/0 0/1  0/0 ..
3   753405  rs61770173  0/0 1/1 0/0  1/0 ..
...
...
...
CHROM   POS rsID    Sample_ID
1   14930   rs150145850 AGM15
2   808922  rs6594027   AGM18
3   753405  rs61770173  AGM12
...
...
...
文件
B
看起来像:

CHROM   POS ID  AGM12   AGM14   AGM15   AGM18 ..
1   14930   rs150145850     0/0 1/1 0/0  0/0 ..
1   14933   rs138566748 0/0 0/0 0/0  0/0 ..
1   63671   rs116440577 0/1 0/0 0/0  0/0 ..
2   808922  rs6594027   0/0 0/0 0/0  0/1 ..
2   753474  rs2073814   1/0 0/0 0/1  0/0 ..
3   753405  rs61770173  0/0 1/1 0/0  1/0 ..
...
...
...
CHROM   POS rsID    Sample_ID
1   14930   rs150145850 AGM15
2   808922  rs6594027   AGM18
3   753405  rs61770173  AGM12
...
...
...
我希望使用文件
B
中的POS字段信息(第2列)将文件
A
中相应的
Sample\u ID
中的内容替换为
NA

例如:输出应该如下所示

CHROM   POS ID  AGM12   AGM14   AGM15   AGM18
1   14930   rs150145850     0/0 1/1 NA   0/0
1   14933   rs138566748 0/0 0/0 0/0  0/0
1   63671   rs116440577 0/1 0/0 0/0  0/0
2   808922  rs6594027   0/0 0/0 0/0  NA
2   753474  rs2073814   1/0 0/0 0/1  0/0
3   753405  rs61770173  NA  1/1 0/0  1/0
如何在Python或Unix中实现这一点?

试试这个

def method(file1, file2, fileout):
    d1, d2, headers = {}
    i = 1
    with open(file1) as f1:  
        for line in f1:
            vars = line.split('\t') #i am assuming tab seperated
            d1[vars[1]] = [vars[0]] + vars[2:]
    with open(file2) as f2:
        for line in f2:
            vars = line.split('\t')
            d2[vars[1]] = vars[2]
    for header in d1['POS']:
        headers[header] = i
        i+=1
    with open(fileout, 'w') as fo:
        fo.write("%s\tPOS\t%s\n" % (d1['POS'][0], "\t".join(d1['POS'][1:]))
        del d1['POS']         
        for key, values in d1.items():
            if key in d2:
                d1[key][headers[d2[key]]] = "NA"
            fo.write("%s\t%s\t%s\n" % (values[0], key, "\t".join(values[1:])))
试试这个

def method(file1, file2, fileout):
    d1, d2, headers = {}
    i = 1
    with open(file1) as f1:  
        for line in f1:
            vars = line.split('\t') #i am assuming tab seperated
            d1[vars[1]] = [vars[0]] + vars[2:]
    with open(file2) as f2:
        for line in f2:
            vars = line.split('\t')
            d2[vars[1]] = vars[2]
    for header in d1['POS']:
        headers[header] = i
        i+=1
    with open(fileout, 'w') as fo:
        fo.write("%s\tPOS\t%s\n" % (d1['POS'][0], "\t".join(d1['POS'][1:]))
        del d1['POS']         
        for key, values in d1.items():
            if key in d2:
                d1[key][headers[d2[key]]] = "NA"
            fo.write("%s\t%s\t%s\n" % (values[0], key, "\t".join(values[1:])))

如果您不介意安装一些软件包,您可以使用
pandas

A = pandas.DataFrame.from_csv("A.txt", sep="\t", index_col=(0,1))
B = pandas.DataFrame.from_csv("B.txt", sep="\t", index_col=(0,1))

A.join(B) # the resulting dataset

当然,您必须选择熊猫才能完成此操作。

如果您不介意安装一些软件包,您可以使用熊猫来完成此操作:

A = pandas.DataFrame.from_csv("A.txt", sep="\t", index_col=(0,1))
B = pandas.DataFrame.from_csv("B.txt", sep="\t", index_col=(0,1))

A.join(B) # the resulting dataset

当然,要做到这一点,您必须选择
pandas

这里有一个使用模块的版本(我假设您的列是以制表符分隔的)


下面是一个使用模块的版本(我假设您的列是以制表符分隔的)



我想说清楚,你有两个文件。这些文件是数据行。两个文件中的数据通过“POS”键匹配。您想将file1中file2中列出的colm的内容替换为NA?-此外,file2中是否存在相同键的重复项?很难说列是如何分隔的,我想说是tab分隔的,但对于file
A
的第一个数据行,列似乎是以tab分隔的?这样做是为了把标签变成空格吗?真的,我的问题是,如何定义输出对齐方式?@InbarRose因为你提到了重复项,我忘了提到文件A也可以同时包含重复项“POs”键,但色度中的相应变量可能不同。例如:CHROM POS ID AGM12 AGM14 AGM15 AGM18。。114930 rs150145850 0/01/10/0/0。。114933 rs138566748 0/0 0/0 0/0。。163671 rs116440577 0/10/0/0/0。。214930 rs1578634 0/0 1/1 0/0 0。。2 808922 rs6594027 0/0 0/0 0/0 0/1。。2753474 rs2073814 1/0 0/0/1 0/0。。3 753405 rs61770173 0/0 1/1 0/0 1/0..需要澄清的是,您有两个文件。这些文件是数据行。两个文件中的数据通过“POS”键匹配。您想将file1中file2中列出的colm的内容替换为NA?-此外,file2中是否存在相同键的重复项?很难说列是如何分隔的,我想说是tab分隔的,但对于file
A
的第一个数据行,列似乎是以tab分隔的?这样做是为了把标签变成空格吗?真的,我的问题是,如何定义输出对齐方式?@InbarRose因为你提到了重复项,我忘了提到文件A也可以同时包含重复项“POs”键,但色度中的相应变量可能不同。例如:CHROM POS ID AGM12 AGM14 AGM15 AGM18。。114930 rs150145850 0/01/10/0/0。。114933 rs138566748 0/0 0/0 0/0。。163671 rs116440577 0/10/0/0/0。。214930 rs1578634 0/0 1/1 0/0 0。。2 808922 rs6594027 0/0 0/0 0/0 0/1。。2753474 rs2073814 1/0 0/0/1 0/0。。3 753405 rs61770173 0/0 1/1 0/0 1/0..使用此模块可能是有意义的。是的,但我喜欢写尽可能少使用导入的答案,特别是当涉及初学者时。足够公平。我想知道有一个(包括电池)模块来完成大部分烦人的工作是很有用的。在处理csv文件(空白、引用值等)时有很多陷阱@InbarRose-1不,不够“公平”--应该教导初学者始终使用“自带电池”库@既然你提到了副本,我忘了提到文件A也可以有副本“POs”键,但色度中的相应变量可能不同。例如:CHROM POS ID AGM12 AGM14 AGM15 AGM18。。114930 rs150145850 0/0 1/1 0/0 0/0。。。214930 rs1578634 0/0 1/1 0/0 0。。2 808922 rs6594027 0/0 0/0 0/0 0/1。。我想用文件1中的示例ID替换匹配的POS/和CHROM键交叉处的数据点使用该模块可能有意义。是的,但我喜欢写尽可能少导入的答案,特别是当涉及初学者时。这很公平。我想知道有一个(包括电池)模块来完成大部分烦人的工作是很有用的。在处理csv文件(空白、引用值等)时有很多陷阱@InbarRose-1不,不够“公平”--应该教导初学者始终使用“自带电池”库@既然你提到了副本,我忘了提到文件A也可以有副本“POs”键,但色度中的相应变量可能不同。例如:CHROM POS ID AGM12 AGM14 AGM15 AGM18。。114930 rs150145850 0/0 1/1 0/0 0/0。。。214930 rs1578634 0/0 1/1 0/0 0。。2 808922 rs6594027 0/0 0/0 0/0 0/1。。我想用文件1中的样本ID替换匹配的POS/和CHROM键交叉处的数据点。这并不能解决他的问题,他不是在合并数据,而是用NA替换列中的数据,其中数据键的列位于第二个文件中。@InbarRose good point--
A.join(B,how=“outer”)
可以这样做。这并不能解决他的问题,他不是在合并数据,而是用NA替换列中的数据,其中数据键的列位于第二个文件中。@in