因此,我在文件的第二列和第三列中设置了某些文本,如下所示:
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 's/\^[^`]*//g' input.txt
GO:0005634`GO:0003677`
GO:0005634`GO:0003677`
GO:0005634`GO:0003677`
GO:0005634`GO:0003677`
解释
sed
用于删除以脱字号 (^) 开头的子字符串,并且可以包含除单个反引号之外的任何内容。一旦遇到反引号,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.txt
,paste
将它们放入 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 为空。