Разбор сложного текстового файла с использованием команд Unix

У меня есть следующая текстовая структура, которую я хотел бы проанализировать:

>Cluster 423 0 56aa, >HWI-ST1448:257:C3V2HACXX:1:1106:19087:2550.1... at 92.86% 1 64aa, >HWI-ST1448:257:C3V2HACXX:1:1106:15943:81371.1... * 2 41aa, >HWI-ST1448:257:C3V2HACXX:1:1106:12438:91360.3... at 90.24% 3 45aa, >HWI-ST1448:257:C3V2HACXX:1:1108:13046:13861.1... at 91.11% 4 52aa, >HWI-ST1448:257:C3V2HACXX:1:1110:12260:2424.2... at 90.38% >Cluster 434 0 64aa, >HWI-ST1448:257:C3V2HACXX:1:1106:15723:89894.1... * 1 46aa, >HWI-ST1448:257:C3V2HACXX:2:1312:1967:40935.2... at 97.83% 

В основном, идентификатор помечен * в конце, а размер группы – последний номер группы +1.

Выход, который я хочу произвести, будет (обратите внимание на размер группы в конце):

 HWI-ST1448:257:C3V2HACXX:1:1106:15943:81371.1 5 HWI-ST1448:257:C3V2HACXX:1:1106:15723:89894.1 2 

Есть идеи?

4 Solutions collect form web for “Разбор сложного текстового файла с использованием команд Unix”

Вот несколько грубых разрезов (без обработки ошибок):

 awk '/\*$/ { save_id = substr($3, 2, length($3)-4) } /^[0-9]/ { save_num = $1 } NR > 1 && /^>/ {print save_id, save_num+1 } END {print save_id, save_num+1 } ' data_file 
  • В строке, которая заканчивается на * (т. Е. Соответствует /*$/ ), извлеките идентификатор группы из третьего слова, отбросив первый символ ( > ) и последние три ( ... ).
  • В строках, начинающихся с числа, сохраните номер (т. Е. Первое слово).
  • Когда вы встретите строку, начинающуюся с > (но исключая первую строку в файле, указав NR > 1 ) или конец файла, выведите соответствующие сохраненные значения.
 perl -F'\n' -lan00e 'print "$1\t$#F" if />(.*)\.{3} \*$/m' 
 sed '/^[>0-9]/h;s/.*>\(.*[0-9]\).*\*/[\1 ]P /p $s/.*//;/^[>0-9[]/d;g;s/ .*/ 1+pc/ ' <<\DATA | dc >Cluster 423 0 56aa, >HWI-ST1448:257:C3V2HACXX:1:1106:19087:2550.1... at 92.86% 1 64aa, >HWI-ST1448:257:C3V2HACXX:1:1106:15943:81371.1... * 2 41aa, >HWI-ST1448:257:C3V2HACXX:1:1106:12438:91360.3... at 90.24% 3 45aa, >HWI-ST1448:257:C3V2HACXX:1:1108:13046:13861.1... at 91.11% 4 52aa, >HWI-ST1448:257:C3V2HACXX:1:1110:12260:2424.2... at 90.38% >Cluster 434 0 64aa, >HWI-ST1448:257:C3V2HACXX:1:1106:15723:89894.1... * 1 46aa, >HWI-ST1448:257:C3V2HACXX:2:1312:1967:40935.2... at 97.83% DATA 

ВЫВОД

 HWI-ST1448:257:C3V2HACXX:1:1106:15943:81371.1 5 HWI-ST1448:257:C3V2HACXX:1:1106:15723:89894.1 2 

Это довольно просто. Он сохраняет копию первого номера в строке для любой строки с символом. Он печатает только в том случае, если он может успешно удалить * в качестве последнего символа в строке или если строка не начинается с >0-9 . В последней строке все символы удаляются. Таким образом, dc получает одну строку [ stuff here ] в p для Cluster и одно маленькое дополнение, когда на пустых строках sed извлекает этот сохраненный номер.

  grep "\*" file.txt |grep -E "(?<=>)[\w+\s\W]+"|sed 's/\.\.\.\*//' 
  • Как я могу исключить тип файла * .sql типа файла ack-grep или размер файла больше> 3 МБ?
  • grep с большим количеством файлов, который содержит много строк?
  • Выполнять команды из истории, которые соответствуют регулярному выражению или grep
  • Вывод `java -version` не соответствует grep или awk
  • sed, grep или tr, которая возвращает только латинские символы из файла UTF-8
  • форматирование вывода файла UNIX
  • Как я рекурсивно grep через сжатые архивы?
  • Удаление строк из шаблона в обратном порядке
  • Как выбрать файлы в папке, в которой заголовок содержит определенный текст?
  • Соответствующая ячейка Grep файла csv и индекс этой строки
  • Как сделать OR grep (с разными настройками GREP_COLOR)
  • Поиск указанных ключевых слов в файлах и копирование в новое имя файла на основе ключевого слова
  • Linux и Unix - лучшая ОС в мире.