簡體   English   中英

使用 awk 命令刪除多余的字符

[英]remove extra characters using awk command

我想從此文件生成一個新文件,但在第二列中,我希望基因版本基本上不存在任何數字。 這是文件內容:

>  chr gene_id            gene_name start end   gene_type           
    1  ENSG00000223972.4 DDX11L1    11869 14412 pseudogene         
    1  ENSG00000227232.3 WASH7P    14363 29806 pseudogene
> 
> 
> The output should look like:                                   
  chr gene_id         gene_name start end   gene_type              
  1   ENSG00000223972 DDX11L1   11869 14412 pseudogene             
  1   ENSG00000227232 WASH7P    14363 29806 pseudogene

我試過這個命令: sed $2 's/ *..*//' gene_annot.parsed.txt > gene1.txt

在最簡單的可能變體中:

awk '{gsub(/\.[0-9]+ /, " ",  $0)}1' genes
> chr     gene_id gene_name       start   end     gene_type 1
> ENSG00000223972       DDX11L1 11869   14412   pseudogene 1
> ENSG00000227232       WASH7P  14363   29806   pseudogene 1
> ENSG00000243485       MIR1302-11      29554   31109   antisense 1
> ENSG00000221311       MIR1302-11      30366   30503   miRNA 1
> ENSG00000237613       FAM138A 34554   36081   protein_coding 1
> ENSG00000240361       OR4G11P 62948   63887   pseudogene 1
> ENSG00000186092       OR4F5   69091   70008   protein_coding

是否應該(在文件的更下方)有其他帶有. 在其他領域,這可能會產生不良結果。

假設. 在第二列之前永遠不會出現,您可以使用 GNU sed如下,讓file.txt內容

>  chr gene_id            gene_name start end   gene_type           
    1  ENSG00000223972.4 DDX11L1    11869 14412 pseudogene         
    1  ENSG00000227232.3 WASH7P    14363 29806 pseudogene

然后

sed 's/\.[0-9]*//' file.txt

output

>  chr gene_id            gene_name start end   gene_type           
    1  ENSG00000223972 DDX11L1    11869 14412 pseudogene         
    1  ENSG00000227232 WASH7P    14363 29806 pseudogene

說明:每行替換文字. (注意\是必需的,因為.對於 GNU sed具有特殊含義)后跟零個或多個( * )數字( [0-9] )使用空字符串(即刪除它)一次。

如果您需要以任何價格使用 GNU AWK ,那么要獲得相同的效果

awk '{sub(/\.[0-9]*/,"");print}' file.txt

使用awk它可能是:

awk 'NR > 1 && index($2,".") {sub(/\.[[:digit:]]*/,"",$2)} 1' file
>  chr gene_id            gene_name start end   gene_type
1 ENSG00000223972 DDX11L1 11869 14412 pseudogene
1 ENSG00000227232 WASH7P 14363 29806 pseudogene
  • 雙重條件:沒有標題,即NR > 1並確保 field2 包含點字符,即index($2,".")
  • 如果為真,則操作:刪除 field2 的點和數字。 最后打印, 1
$ awk '{sub(/\..*/,"",$2)} 1' file
chr gene_id            gene_name start end   gene_type
1 ENSG00000223972 DDX11L1 11869 14412 pseudogene
1 ENSG00000227232 WASH7P 14363 29806 pseudogene

或者,如果您更喜歡視覺 alignment:

$ awk '{sub(/\..*/,"",$2)} 1' file | column -t
chr  gene_id          gene_name  start  end    gene_type
1    ENSG00000223972  DDX11L1    11869  14412  pseudogene
1    ENSG00000227232  WASH7P     14363  29806  pseudogene

暫無
暫無

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

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