簡體   English   中英

使用SED / AWK在特定列上替換正則表達式

[英]Regex replace on specific column with SED/AWK

我的數據看起來像這樣(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'

    使用tab作為輸出上的字段分隔符

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM