我想知道是否有人可以帮助我解决一个特定的编码问题。我有一个 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
:记录数(如果有一个文件则为行号)