我有一个像这个小例子的文本文件:
>ENST00000599533.1|ENSG00000269831.1|-|-|AL669831.1-201|AL669831.1|43
FFYFIIWSLTLLPRAGLELLTSSDPPASASQSVGITGVSHHAQ
>ENST00000594233.1|ENSG00000269308.1|-|-|AL645608.2-201|AL669831.1|18
DFMHLFFIPSSELILPYP
>ENST00000420190.1|ENSG00000187634.6|OTTHUMG00000040719.8|OTTHUMT00000316521.1|SAMD11-011|SAMD11|179
MSKGILQVHPPICDCPGCRISSPVNRGRLADKRTVALPAARNLKKERTPSFSASDGDSDGSGPTCGRRPGLKQEDGPHIRIMKRRVHTHWDVNISFREASCSQDGNLPTLISSVHRSRHLVMPEHQSR
>ENST00000437963.1|ENSG00000187634.6|OTTHUMG00000040719.8|OTTHUMT00000097862.3|SAMD11-003|SAMD11|109
MSKGILQVHPPICDCPGCRISSPVNRGRLADKRTVALPAARNLKKERTPSFSASDGDSDGSGPTCGRRPGLKQEDGPHIRIMKRRVHTHWDVNISFREASCSQDGNLPT
这个文件有很多部分,每个部分有2行。第一行是以">"
开头的ID,第二行是一系列字符。
在ID行中,字段为“|”分开并查看第6列,每个ID都有很多重复。我想从这个中创建一个新文件,其中每个ID只有一个重复,并且是第7列中编号最大的那个。所以实际上在新文件中我只有一个ID重复一次(根据第6列),这是第7列中具有最高编号的ID(在列6中具有相似名称的ID中)。
小例子的预期输出是:
>ENST00000599533.1|ENSG00000269831.1|-|-|AL669831.1-201|AL669831.1|43
FFYFIIWSLTLLPRAGLELLTSSDPPASASQSVGITGVSHHAQ
>ENST00000420190.1|ENSG00000187634.6|OTTHUMG00000040719.8|OTTHUMT00000316521.1|SAMD11-011|SAMD11|179
MSKGILQVHPPICDCPGCRISSPVNRGRLADKRTVALPAARNLKKERTPSFSASDGDSDGSGPTCGRRPGLKQEDGPHIRIMKRRVHTHWDVNISFREASCSQDGNLPTLISSVHRSRHLVMPEHQSR
制作这个文件我写了这段代码:
awk -F"|" ' /^>/{(array1[val]=array[val]>length($0)) print array1} Input.txt > out.txt
但它不会返回任何内容。你知道如何解决它以获得预期的输出吗?
答案 0 :(得分:1)
编辑: 根据OP的需要添加解决方案,它将按照输入文件本身ID的相同顺序提供输出。
awk -F"|" '
/^>/ && !d[$6]++{
f[++count]=$6
}
/^>/{
c[$6]=$0;
a[$6]++;
val=$6;
getline;
b[val]=length(b[val])>length($0)?(b[val]?b[val]:$0):$0
}
END{
for(i=1;i<=count;i++){
if(a[f[i]]>1){
print c[f[i]] ORS b[f[i]]}
}}' Input_file
如果您不担心输出序列(就像它应该与Input_file的序列相同),那么以下内容可以帮助您。
awk -F"|" '
/^>/{
c[$6]=$0;
a[$6]++;
val=$6;
getline;
b[val]=length(b[val])>length($0)?(b[val]?b[val]:$0):$0
}
END{
for(i in a){
if(a[i]>1){
print c[i] ORS b[i]}
}
}' Input_file
在某些时候也会在输出中添加带序列的代码。
答案 1 :(得分:1)
如果重复的ID是连续的......
python main.py