我正在努力解决下面解释的问题。我也分享不完整的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")
我无法将第一列条目与连续的相同列条目进行比较。 该文件非常大,因此一个班轮无效。
答案 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)