根据列

时间:2016-04-08 14:59:01

标签: python

我正在努力解决下面解释的问题。我也分享不完整的python脚本,这对这个问题不起作用。如果得到我的剧本的支持或指示,我将不胜感激。

我的制表符分隔文件如下所示:

+   5     1364182    TTGC
-   5     1364204    GATG
+   1     9372980    TTCA
-   1     9373028    GGAA
+   2     14029383   ACCA
-   2     14029437   ACCA
-   1     19815169   AGTT
-   1     19815254   CCGT
+   4     13475195   AGCA
-   4     13475251   TCTC
-   5     64182      TTGC
-   5     64204      GATG
+   1     9372980    TTCA
-   1     9373028    GGAA
+   2     14029383   ACCA
-   2     14029586   ACCT

我试图在第一列(即+和 - )的基础上删除整行,如果它连续重复,除了第一个匹配。输出应如下所示:

+   5     1364182    TTGC
-   5     1364204    GATG
+   1     9372980    TTCA
-   1     9373028    GGAA
+   2     14029383   ACCA
-   2     14029437   ACCA
+   4     13475195   AGCA
-   4     13475251   TCTC
+   1     9372980    TTCA
-   1     9373028    GGAA
+   2     14029383   ACCA
-   2     14029586   ACCT

脚本:

#!/usr/bin/python

gff = raw_input("Enter the gff file: ")
gff_file = open(gff, "r")
f1 = open("f1", "w")

for line in gff_file:
        line = line.rstrip()
        line = line.split("\t")
        x = line[0]
        for line1 in gff_file:
                line1 = line1.rstrip()
                line1 = line1.split("\t")
                y = next(line1[0])
                if x != y:
                        f1.write(x + line1[0]+"\n")

我无法将第一列条目与连续的相同列条目进行比较。 该文件非常大,因此一个班轮无效。

3 个答案:

答案 0 :(得分:1)

如果这不是编程练习并且您只想清理数据,请切换到$ awk 'p!=$1{p=$1; print}' file + 5 1364182 TTGC - 5 1364204 GATG + 1 9372980 TTCA - 1 9373028 GGAA + 2 14029383 ACCA - 2 14029437 ACCA + 4 13475195 AGCA - 4 13475251 TCTC + 1 9372980 TTCA - 1 9373028 GGAA + 2 14029383 ACCA 。它甚至不是单行。

public class SelfPatient {
    public static class selfMapper1 extends Mapper<LongWritable,Text,Text,IntWritable>
    {
        public void map(LongWritable key,Text value,Context context) throws IOException,InterruptedException
        {
            //IntWritable clas =new IntWritable(Integer.parseInt(str.nextToken(",")));
            String Line=value.toString();
            String[] elements=Line.split(",");
            int surv=Integer.parseInt(elements[1]);
            Text clas=new Text(elements[4]);
            //int i=Integer.parseInt(elements[0]);
            //IntWritable number=new IntWritable(i);

            context.write(new Text(clas),new IntWritable(surv));
            //context.write(clas,number);

        }
    }
    public static class selfReducer1 extends Reducer<Text,IntWritable,Text,IntWritable>
    {
        public void reduce(Text key,Iterable<IntWritable> values,Context context) throws IOException,InterruptedException
        {

            int sum=0;
            for (IntWritable val :values) 
            {
                sum += val.get();

            }

            context.write(key, new IntWritable(sum));
        }
    }

答案 1 :(得分:1)

如果我理解正确,您基本上按第一个符号(+-)的群集进行分组,并且您只想保留第一个符号。这是itertools.groupby的一个很好的用例:

from itertools import groupby

with open("data.gff") as fp_in, open("data_reduced.gff","w") as fp_out:
    grouped = groupby(fp_in, key=lambda x: x.split("\t")[0])
    for key, group in grouped:
        fp_out.write(next(group))

groupby接受一个可迭代的(这里是输入文件fp_in)和一个关键函数,我将其作为lambda x: x.split("\t")[0]传递,意思是&#34;走线,用标签分割它,给我第一个元素&#34;。

它产生包含密钥(在此处为+-)的对,以及在该组的所有元素上的迭代器 - 在这种情况下,以...开头的连续的行组同一个标志。我们选择第一个next(group)并将其写出来。

答案 2 :(得分:0)

这应该可以解决问题:

consec_lines = False
x = None
for line in gff_file:
    line = line.rstrip()
    line = line.split("\t")
    if line[0] == x:
        consec_lines = True
        continue
    x = line[0]
    consec_lines = False
    for i in line+"\n":
        f1.write(i)