我的数据如下所示(制表符分隔):
Organ K ClustNo Analysis
LN K200 C12 Gene Ontology
LN K200 C116 Gene Ontology
CN K200 C2 Gene Ontology
我想做的是删除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'
使用制表符作为输入的字段分隔符。
-
-v OFS='\t'
使用制表符作为输出的字段分隔符
-
NR>=2 {sub(/^C/, "", $3)}
去掉初始的C
来自字段 3 的仅适用于第一行之后的行。
-
1
这是 awk 对 print-the-line 的神秘简写。
使用 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})
匹配前两个制表符分隔的列。这假设只有一个制表符分隔每一列。因为正则表达式包含在括号中,所以它匹配的内容稍后将可用\1
.
C
这场比赛C
.
\1
仅用前两列替换匹配的文本,而不是C
..
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)