输入:
bta01524 Platinum drug resistance - Bos taurus (cow) (1)
bta:514386 BIRC3
bta01522 Endocrine resistance - Bos taurus (cow) (2)
bta:280795 FOS
bta:281848 IGF1R
所需的输出:
bta01524 BIRC3
bta01522 FOS
bta01522 IGF1R
我一直在尝试以下代码,但无法删除bta:
sed 's%/\bta:/b[^ ]*%%g' output.txt
答案 0 :(得分:2)
如果行不是以空格(/^[^ ]/
开头),则将第一列保存到变量save
中。如果行以空格(/^ /
开头并且包含列(NF!=0
),则打印变量save
和列2的内容。
awk '/^[^ ]/ {save=$1}; /^ / && NF!=0 {print save,$2}' file
输出:
bta01524 BIRC3 bta01522 FOS bta01522 IGF1R
答案 1 :(得分:1)
除了sed
,awk
还可以为您的问题提供一个很好的解决方案,例如
awk '/^\w/{lbl=$1;next} NF>1{print lbl,$NF}' file
说明
/^\w{lbl=$1;next}
(如果第一个字符是\w
(单词字符),则将标签(lbl
)设置为第一个字段并获取next
记录; NF>1{print lbl,$NF}
,如果字段数(NF
)大于1,则打印标签和最后一个字段。(注意:,'\w'
单词速记需要GNU awk,相当于[a-zA-Z0-9_]
)
使用/输出示例
使用您在file
中的输入
$ awk '/^\w/{lbl=$1;next} NF>1{print lbl,$NF}' file
bta01524 BIRC3
bta01522 FOS
bta01522 IGF1R
答案 2 :(得分:0)
这可能对您有用(GNU sed):
sed -En '/^\S/h;//d;G;s/^.*\s(\S+)\n(\S+).*/\2 \1/p' file
如果当前行以非空白开头,请在保留空间中进行复制,然后将其删除。否则,将保留空间附加到当前行,并使用模式匹配和反向引用来调整所需的格式。如果成功,则打印结果。
设置选项-n
可以防止正常打印并复制 grep-like 性质。