Мне интересно, может ли кто-нибудь помочь мне с конкретным вопросом кодирования. У меня есть файл секвенирования ДНК, который читает что-то вроде этого (в качестве примера):

Plate1A1_R1_AGTAGTACGACTAGCATCAGCATACGATCAGCATCAGCATCAG
Plate1A1_R1_GTAGATCGATGCATGCATGCTAGCTAGCTAGCTAGCTAGCTAA
Plate1A1_R1_AGCTAGCATCGATCGATGCTAGCATGCATCGATCGATGCATGC
Plate1A1_R2_AGCATCGATGCAGCATGCTAGCTAGCTAGCTAGCAGCTAGTCT
Plate1A1_R2_AGCATGCATCGATCGTAGCTAGCAGCGAGCGGCATCGATCGAT
Plate1A2_R1_CAGCTAGATGCATCGATCGATCGATCGATCGATGCTAGCTTAC
Plate1A2_R1_CAGTAGCATGCATGCATGCATGCATGCATCGATGCTAGCTAGC
Plate1A2_R1_ACAACGTAGCTAGCTAGCTACTACTAGTCATCATCGATGCTAG
Plate1A2_R1_CAGCTAGCTAGCTAGCTAGGCTACATCGATCGTAGCTAGTCGA
Plate1A2_R1_CAGTCAGCATGCTATCGATCGTAGCTAGTCATCGATGTAGTGA
....etc.

Вы можете видеть, что есть линии, которые принадлежат одному и тому же аналогичному начальному шаблону (здесь: Plate1A1_R1, Plate1A1_R2, Plate1A2_R1). Я хотел бы разместить пустую строку после каждой группировки, например:

Plate1A1_R1_AGTAGTACGACTAGCATCAGCATACGATCAGCATCAGCATCAG
Plate1A1_R1_GTAGATCGATGCATGCATGCTAGCTAGCTAGCTAGCTAGCTAA
Plate1A1_R1_AGCTAGCATCGATCGATGCTAGCATGCATCGATCGATGCATGC

Plate1A1_R2_AGCATCGATGCAGCATGCTAGCTAGCTAGCTAGCAGCTAGTCT
Plate1A1_R2_AGCATGCATCGATCGTAGCTAGCAGCGAGCGGCATCGATCGAT

Plate1A2_R1_CAGCTAGATGCATCGATCGATCGATCGATCGATGCTAGCTTAC
Plate1A2_R1_CAGTAGCATGCATGCATGCATGCATGCATCGATGCTAGCTAGC
Plate1A2_R1_ACAACGTAGCTAGCTAGCTACTACTAGTCATCATCGATGCTAG
Plate1A2_R1_CAGCTAGCTAGCTAGCTAGGCTACATCGATCGTAGCTAGTCGA
Plate1A2_R1_CAGTCAGCATGCTATCGATCGTAGCTAGTCATCGATGTAGTGA

....etc.

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

Я попытался использовать sed и awk с помощью циклов 'while read line', но не могу найти способ удержать первые 11 символов в переменной поиска, которые будут использоваться в последовательных строках текстового файла, если этот поиск переменная «застревает» при обработке отдельной строки.

Я надеюсь, что кто-то может помочь с решением, которое позволило бы получить доступ к указанному файлу с помощью перенаправления (<) (с сотнями строк данных последовательности ДНК в этом формате и несколькими сотнями различных «имен пластин», определенных как скрипт перемещается по файлу построчно), например, while read line ; do echo "${line:0:11}" ; done < filename.txt

2 ответа2

1

Я справился с этим, используя только команды bash :

p=; while read l; do [ "$p" -a "${l:0:11}" != "${p:0:11}" ] && echo; echo "$l"; p="$l"; done < FileName

Здесь l - текущая строка, а p - предыдущая, добавление "$p" -a предотвращает начальную пустую строку, а && - более компактный способ выражения if .

0

решение awk (похоже на AFH)

awk 'NR == 1 { prev=substr($0,1,11) ; } 
     NR >  1 { pref=substr($0,1,11) ; if ( prev != pref ) printf "\n" ; prev=pref ; } 
     {print ; } ' file

где

  • prev/pref обозначает предыдущий /prefix
  • NR : номер записи (то есть номер строки, если есть один файл)

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .