Разбор сложного текстового файла с использованием команд 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 

Есть идеи?

  • Как сгладить журналы для списка шаблонов и сделать из него отчет?
  • Найти шаблон из одного файла, указанного в другом
  • Выполняет ли команда cat возврат файла или содержимого файла?
  • Почему результат grep зависит от пути к папке?
  • Как найти файл с использованием нескольких шаблонов
  • генерировать ссылки страниц с добавочной переменной
  • Почему добавление двоеточия нарушает этот шаблон grep?
  • Вставка строки в файл только в том случае, если эта строка еще не является частью файла
  • 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/\.\.\.\*//' 
    Linux и Unix - лучшая ОС в мире.