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

标签 linux unix awk sed

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

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/

相关文章:

c - linux c编程fifo无故失败

linux - 应用子文件夹中的所有 stash 更改

linux - 如何以编程方式在 Linux 中截取应用程序的屏幕截图?

c - POSIX系统上通用字符有什么用?

linux - 如何仅删除某个目录下的重复文件(具有相同的校验和)

linux - tcsh:ls vs pwd vs cd

linux - Linux 下的 Live DVD 刻录

linux - 如何查找没有访问权限的目录?

bash - 如果第 2 列字段有多个值,则格式化输出

linux - 如何缩进文件+bash中的行