regex - 在最后一个匹配后添加一行和字符

标签 regex linux awk sed

我有一个文件,需要在行开头的最后一个匹配项(3 位数字)之后附加一行(以及几个字符)。数据按(许多)基因编号(122,239,...)分组,每个基因可能有不同数量的个体。

cat test

122_mex1 TGCAGGC
122_mex2 TGCAGTC
122_mex3 TGCAGTC
122_can4 TGCATTT
239_mex1 TGCAAAA
239_mex2 TGCAAAA
239_can4 TGCAGCA
...
567_can4 TGCAAAT

输出应如下所示:

cat output

122_mex1 TGCAGGC
122_mex2 TGCAGTC
122_mex3 TGCAGTC
122_can4 TGCATTT
//|1
239_mex1 TGCAAAA
239_mex2 TGCAAAA
239_can4 TGCAGCA
//|2

etc.

那么如何找到每行开始的每个基因编号的最后一个匹配项,并在一行中附加一些字符,向上计数(1、2、3等)?

我找到了一种在提供的匹配项后附加一行的方法(例如 122)

awk '/122/{seen++} seen && !/122/{print "//|1"; seen=0} 1' test

但我喜欢附加所有基因编号(122、239、455、234 等),循环基因并将每个连续的基因编号附加到以下行“//i”上。

关于如何开始这个有什么想法吗?

谢谢!

最佳答案

这就能解决问题:

$ awk -F_ 'NR>1 && last!=$1{print "//|"++i}{last=$1}1' test
122_mex1 TGCAGGC
122_mex2 TGCAGTC
122_mex3 TGCAGTC
122_can4 TGCATTT
//|1
239_mex1 TGCAAAA
239_mex2 TGCAAAA
239_can4 TGCAGCA
//|2
...
//|3
567_can4 TGCAAAT

要保存结果,请使用 shell 重定向:

$ awk -F_ 'NR>1 && last!=$1{print "//|"++i}{last=$1}1' test > output

关于regex - 在最后一个匹配后添加一行和字符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29544559/

相关文章:

Linux (Ubuntu 9.04) 权限 - 如何删除 rws?

Linux - Bash 将字符串重定向到文件

linux - 在匹配前删除换行符 - Linux

python - 使用 Bash 编辑 YAML 文件

sql - 从特定列中查找小数位数

c# - 快速正则表达式问题

c# - 在 C# 中查找字符串中的所有模式索引

java - Fitnesse Framework 在决策表中使用正则表达式?

linux - 使用awk从两个文件写一个两列文件

linux - 查找带有重音字符的 unix 文件