如何使用awk将文本文件汇总为新文件

时间:2018-06-11 17:55:25

标签: awk

我有一个像这个小例子的文本文件:

>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

但它不会返回任何内容。你知道如何解决它以获得预期的输出吗?

2 个答案:

答案 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