如何使用awk将文本文件摘要为新文件

如何使用awk将文本文件摘要为新文件,awk,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|EN

我有一个文本文件,如以下小示例:

>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
但它不会返回任何内容。您知道如何修复它以获得预期的输出吗?

编辑:根据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
也将在某个时候在输出中添加带有序列的代码。

编辑:根据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

有时也会在输出中添加带有序列的代码。

如果重复的ID是连续的

$ awk -F'|' -v RS='>' -v ORS='' 'NR>1 && p!=$6   {max=$7; r=rt $0; p=$6; print r; r=""}
                                 p==$6 && max<$7 {max=$7; r=rt $0} 
                                                 {rt=RT}
                                 END             {if(r) print r}' file

>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'|'-vrs='>'-vrs=''''NR>1&&p=$6{max=$7;r=rt$0;p=$6;print r;r=”“}

p==$6&&max如果重复的ID是连续的

$ awk -F'|' -v RS='>' -v ORS='' 'NR>1 && p!=$6   {max=$7; r=rt $0; p=$6; print r; r=""}
                                 p==$6 && max<$7 {max=$7; r=rt $0} 
                                                 {rt=RT}
                                 END             {if(r) print r}' file

>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'|'-vrs='>'-vrs=''''NR>1&&p=$6{max=$7;r=rt$0;p=$6;print r;r=”“}


p==$6&&maxID为AL645608.2的第二条记录为什么消失了?或者,更好的问题是,是什么使IDs等效?因为在第7列的ID行中,第2个AL645608.2的值较小。在ID行中,列在主文件中以“|”分隔,因为我只希望每个ID重复一次,这是第7列中值最高的一次。在这个例子中,我有两个重复的ID。但是对于其他一些ID,重复的次数可能更多。重复的是什么?我们看不到您的实际文件,只看到您在这里发布的内容。是否可以从已发布的输入生成已发布的输出?规则是什么?行的长度与这个逻辑有什么关系?@karakfa:正如问题中提到的,每个部分有2行。第一行是以“>”开头的ID行。在该行中,列是“|”分隔的。在不同的ID行中有许多重复的第6列,如示例所示。我只想重复一次,但在第7列中有最大值的一次为什么ID为AL645608.2的第二条记录消失了?或者,更好的问题是,是什么使IDs等效?因为在第7列的ID行中,第2个AL645608.2的值较小。在ID行中,列在主文件中以“|”分隔,因为我只希望每个ID重复一次,这是第7列中值最高的一次。在这个例子中,我有两个重复的ID。但是对于其他一些ID,重复的次数可能更多。重复的是什么?我们看不到您的实际文件,只看到您在这里发布的内容。是否可以从已发布的输入生成已发布的输出?规则是什么?行的长度与这个逻辑有什么关系?@karakfa:正如问题中提到的,每个部分有2行。第一行是以“>”开头的ID行。在该行中,列是“|”分隔的。在不同的ID行中有许多重复的第6列,如示例所示。我只想重复一次,但在第7列中有最大值的一次实际上,每个ID的以下顺序也很重要。因为下一步我需要这个答案。@user7249622,我发现你从来没有选择正确的答案,所以请在帖子上看到足够多的答案后这样做,并尝试向人们投票,以鼓励他们的答案,如果这对你有帮助,请让我知道。@user7249622,现在查看我的编辑解决方案并让我知道?我相信这会对您有所帮助。@RavinderSingh13:只有一个问题:ID的选择是基于第2行或ID行第7列中的序列长度吗?@user7249622,ID的选择是第1行-它们应该有1次以上的出现,第2行-根据您显示的输出,它们下一行的长度应该是最高的,让我知道这是否有帮助?实际上,每个ID的以下顺序也很重要。因为下一步我需要这个答案。@user7249622,我发现你从来没有选择正确的答案,所以请在帖子上看到足够多的答案后这样做,并尝试向人们投票,以鼓励他们的答案,如果这对你有帮助,请让我知道。@user7249622,现在查看我的编辑解决方案并让我知道?我相信这会对您有所帮助。@RavinderSingh13:只有一个问题:ID的选择是基于第2行或ID行第7列中的序列长度吗?@user7249622,ID的选择是第1行-它们应该有1次以上的出现,第2行-根据您显示的输出,它们下一行的长度应该是最高的,让我知道这是否有用?谢谢。请你为每行写上评论好吗?谢谢。请你对每一行都发表评论好吗?