как суммировать текстовый файл в новый с помощью awk - PullRequest
0 голосов
/ 11 июня 2018

У меня есть текстовый файл, подобный этому небольшому примеру:

>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 поля «|»разделив и глядя на 6-й столбец, есть много повторений каждого идентификатора.Я хочу создать из этого файла новый файл, в котором будет только один повтор каждого идентификатора, и это файл с наибольшим номером в столбце 7. Так что фактически в новом файле у меня будет только один повтор каждого идентификатора (согласно 6-му столбцу) и это идентификатор с наибольшим номером (среди идентификаторов с аналогичным именем в столбце 6) в столбце 7. ожидаемый результат для небольшого примера будет:

>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 голосов
/ 11 июня 2018

, если повторяющиеся идентификаторы непрерывны ...

$ 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
0 голосов
/ 11 июня 2018

РЕДАКТИРОВАТЬ: Добавление решения в соответствии с потребностями ОП, который будет обеспечивать вывод в том же порядке, в котором идентификаторы поступают в сам файл Input_file.

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

В какой-то момент добавит код с последовательностью в выходной файл.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...