我有看起来像这样的数据(用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//'
什么是正确的方法?
最佳答案
使用awkawk
是一个很好的工具:
$ 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
..