在循环中,在特定搜索条件后插入字符串或空行

在循环中,在特定搜索条件后插入字符串或空行

我想知道是否有人可以帮助我解决一个特定的编码问题。我有一个 DNA 测序文件,其内容如下(作为示例):

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 个字符保存在搜索变量中以供在文本文件的连续行中使用,如果该搜索变量在处理单独一行时“卡住”。

我希望有人能帮助提供一个解决方案,允许使用重定向(<)访问引用的文件(包含数百行这种格式的 DNA 序列数据,以及几百个不同的“板名”,因为脚本逐行移动文件),例如while read line ; do echo "${line:0:11}" ; done < filename.txt

答案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

答案2

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代表前一个/前缀
  • NR:记录数(如果有一个文件则为行号)

相关内容