我有看起来像这样的数据(用TAB分隔):

Organ K     ClustNo Analysis
LN    K200  C12     Gene Ontology
LN    K200  C116    Gene Ontology
CN    K200  C2      Gene Ontology

我想要做的是删除第3列中除标题行外的每一行的C:
Organ K     ClustNo Analysis
LN    K200  12      Gene Ontology
LN    K200  116     Gene Ontology
CN    K200  2       Gene Ontology

这不会做,因为它将影响其他列和标题行:
sed 's/C//'

什么是正确的方法?

最佳答案

使用awk
awk是一个很好的工具:

$ awk -F'\t' -v OFS='\t' 'NR>=2{sub(/^C/, "", $3)} 1' file
Organ   K       ClustNo Analysis
LN      K200    12      Gene Ontology
LN      K200    116     Gene Ontology
CN      K200    2       Gene Ontology

这个怎么运作
  • -F'\t'
    使用tab作为输入的字段定界符。
  • -v OFS='\t'
    使用制表符作为输出
  • 上的字段定界符
  • NR>=2 {sub(/^C/, "", $3)}
    仅对于第一行之后的行,从字段3中删除初始C
  • 1
    这是awk的在线打印的隐秘速记。

  • 使用sed
    $ sed -r '2,$ s/(([^\t]+\t+){2})C/\1/' file
    Organ   K       ClustNo Analysis
    LN      K200    12      Gene Ontology
    LN      K200    116     Gene Ontology
    CN      K200    2       Gene Ontology
    
  • -r
    使用扩展的正则表达式。 (在Mac OSX或其他BSD平台上,请改为使用-E。)
  • 2,$ s/(([^\t]+\t){2})C/\1/
    此替换仅适用于从2到文件末尾的行。
    (([^\t]+\t){2})与前两个制表符分隔的列匹配。假定只有一个选项卡分隔每一列。由于正则表达式包含在parens中,因此它所匹配的内容稍后将以\1的形式提供。
    C此匹配项C
    \1仅用前两列替换匹配的文本,而不是C ..
  • 07-24 09:44
    查看更多