匹配后删除字符串,并排除空换行符

时间:2019-08-18 06:12:09

标签: shell awk sed

输入:

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

3 个答案:

答案 0 :(得分:2)

如果行不是以空格(/^[^ ]/开头),则将第一列保存到变量save中。如果行以空格(/^ /开头并且包含列(NF!=0),则打印变量save和列2的内容。

awk '/^[^ ]/ {save=$1}; /^ / && NF!=0 {print save,$2}' file

输出:

bta01524 BIRC3
bta01522 FOS
bta01522 IGF1R

答案 1 :(得分:1)

除了sedawk还可以为您的问题提供一个很好的解决方案,例如

awk '/^\w/{lbl=$1;next} NF>1{print lbl,$NF}' file

说明

  • 规则1-/^\w{lbl=$1;next}(如果第一个字符是\w(单词字符),则将标签(lbl)设置为第一个字段并获取next记录;
  • 规则2-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 性质。

相关问题