gpt4 book ai didi

linux - 正则表达式用 SED/AWK 替换特定列

转载 作者:IT王子 更新时间:2023-10-29 00:57:37 25 4
gpt4 key购买 nike

我有这样的数据(制表符分隔):

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'

    使用制表符作为输入的字段分隔符。

  • -v OFS='\t'

    使用制表符作为输出的字段分隔符

  • NR>=2 {sub(/^C/, "", $3)}

    仅针对第一行之后的行从字段 3 中删除初始 C

  • 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..

关于linux - 正则表达式用 SED/AWK 替换特定列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29091138/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com