在循环中的特定搜索变量的最后一个实例之后插入字符串或行

在循环中的特定搜索变量的最后一个实例之后插入字符串或行

我想知道是否有人可以帮助我解决特定的编码问题。我有一个 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 个字符,搜索该模式在下面的行中不再出现的位置,并在该点插入一个空行。

我试过了sedawk努力使用while read line循环,但似乎无法找到一种方法来保存要在文本文件的连续行中使用的搜索变量中的前 11 个字符(如果该搜索变量“卡住”在单个行的处理中) 。

我希望有人能提供一个解决方案,允许通过重定向 (<) 访问引用的文件(这种格式有数百行 DNA 序列数据,以及数百个不同的“板名称”,定义为脚本在文件中逐行移动),例如

while read line ; do echo "${line:0:11}" ; done < filename.txt

感谢您的任何建议!

答案1

awk '{
  thisplate=substr($0, 1, 11); 
  if (thisplate != plate) { 
    print ""; 
    plate=thisplate 
  };
  print }' < input | sed '1d'

这是 Sukminder 刚刚发表的评论的较长版本;它保存 11 个字符的前缀,如果新前缀与之前的前缀不同,则打印换行符。删除sed空的第一行。

相关内容