在一列中多次删除一个字符后面的文本

在一列中多次删除一个字符后面的文本

因此,我在文件的第二列和第三列中设置了某些文本,如下所示:

GO:0005634^cellular_component^nucleus`GO:0003677^molecular_function^DNA binding`  

我想删除所有与功能相关的文本,并得到如下输出:

GO:0005634`GO:0003677

我不知道如何使用 sed 或 awk 来解决这个问题

笔记: 线条有不同数量的GO:xxxxxxx.

答案1

看起来数据使用反引号作为记录分隔符,使用抑扬符作为字段分隔符。

printf 'GO:0005634^cellular_component^nucleus`GO:0003677^molecular_function^DNA binding`' |
awk -F '^' -v RS='`' -v ORS='`' '{ print $1 }'

这仅打印每个记录的第一个字段(GO 术语),并使用反引号作为输出记录分隔符。

输出:

GO:0005634`GO:0003677`

(没有尾随换行符)

答案2

我相信这就是您所要求的。笔记: input.txt是你的输入文件。

只是 sed
$ sed 's/\^[^`]*//g' input.txt
GO:0005634`GO:0003677`
GO:0005634`GO:0003677`
GO:0005634`GO:0003677`
GO:0005634`GO:0003677`
解释

sed用于删除以脱字号 (^) 开头的子字符串,并且可以包含除单个反引号之外的任何内容。一旦遇到反引号,sed将用任何内容替换它,从而有效地删除它。重复这种模式直到筋疲力尽。这具有删除所有字符串的效果^....

grep + 粘贴 + sed
$ grep -o 'GO:[0-9]\+' input.txt | paste -d'`' - - | sed 's/$/`/'
GO:0005634`GO:0003677`
GO:0005634`GO:0003677`
GO:0005634`GO:0003677`
GO:0005634`GO:0003677`
解释

grep从文件中取出所有 GO:XXXXX 字符串input.txtpaste将它们放入 2 列中,在 2 个 GO:XXXXX 字符串之间添加一个勾号,最后sed在末尾添加一个勾号。

参考

答案3

使用 GNU Awk ( gawk):

gawk 'BEGIN{FPAT="`?GO:[0-9]+"; OFS=""} {$1=$1} 1' file

前任。

$ echo 'GO:0005634^cellular_component^nucleus`GO:0003677^molecular_function^DNA binding`' | 
  gawk 'BEGIN{FPAT="`?GO:[0-9]+"; OFS=""} {$1=$1} 1'
GO:0005634`GO:0003677

答案4

perl -lne 'print /((?:^|`)GO:\d+)/g' genes.file

解释:

  • 以行模式执行perl,并将记录显式打印到标准输出-n
  • 正则表达式/((?:^|`)GO:\d+)/g在当前记录中,字符串 GO: 的右侧是一个数字,左侧是 BOL 或反引号。然后,它会被多次抓取,/g 选项,并交给 print 命令,然后将其显示到 stdout,默认 OFS 为空。

相关内容