используйте awk, чтобы разбить один файл на несколько небольших файлов по шаблону - PullRequest
0 голосов
/ 07 декабря 2018

Я прочитал эту запись об использовании awk для разделения одного файла на несколько файлов:

, и меня интересует одно из решений, предложенных Pramod и jaypal singh:

awk '/^>chr/ {OUT=substr($0,2) ".fa"}; {print >> OUT; close(OUT)}' Input_File

Потому что я до сих пор не могу добавить комментарий, поэтому я спрашиваю здесь.Если введено значение

>chr22
asdgasge
asegaseg
>chr1
aweharhaerh
agse
>chr14
gasegaseg

Почему получится три файла:

chr22.fasta  
chr1.fasta  
chr14.fasta

Например, в chr22.fasta:

>chr22
asdgasge
asegaseg

Iпонять первую часть

/^>chr/ {OUT=substr($0,2) ".fa"};

и эти команды:

/^>chr/  substr()  close() >>

Но я не понимаю, как awk разделил ввод по второй части:

{print >> OUT; close(OUT)}

Может кто-нибудь объяснить более подробно об этой команде?Большое спасибо!

Ответы [ 2 ]

0 голосов
/ 07 декабря 2018

Часть, о которой вы задаете вопросы, немного неудобна:

{ print $0 >> OUT; close(OUT) }

С этой частью программа awk делает следующее для каждой строки, которую она обрабатывает :

  • Открыть файл OUT
  • Переместить указатель файла на конец файла OUT
  • , добавить строку $0, затем ORS к файлуOUT
  • закрыть файл OUT

Почему это неудобно?Главным образом из-за структуры ваших файлов.Вы должны закрывать файл только тогда, когда вы закончили писать в него, а не каждый раз, когда вы пишете в него.В настоящее время, если у вас есть запись fasta из 100 строк, она откроется, закроет файл 100 раз.

Лучшим подходом будет:

awk '/^>chr/{close(OUT); OUT=substr($0,2)".fasta" }
     {print > OUT }
     END {close(OUT)}'

Здесь мы открываем только файлв первый раз мы пишем в него и закрываем его, когда он нам больше не нужен.

note: оператор END на самом деле не нужен.

0 голосов
/ 07 декабря 2018

Не могли бы вы выполнить следующие действия и сообщить мне, поможет ли это вам.

awk '                             ##Starting awk program here.
/^>chr/{                          ##Checking condition if a line starts from string chr then do following.
  OUT=substr($0,2) ".fa"          ##Create variable OUT whose value is substring of current line and starts from letter 2nd to till end. concatenating .fa to it too.
}
{
  print >> OUT                    ##Printing current line(s) in file name whose value is variable OUT.
  close(OUT)                      ##using close to close output file whose value if variable OUT value. Basically this is to avoid "TOO MANY FILES OPENED ERROR" error.
}' Input_File                     ##Mentioning Input_file name here.

Вы можете взять ссылку со страницы man awk для используемых функций awk, как показано ниже.

   substr(s, i [, n])      Returns the at most n-character substring of s starting at i.  If n is omitted, the rest of s is used.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...