awkと正規表現を使用してテーブルの特定の列で文字列を置き換える方法は?

awkと正規表現を使用してテーブルの特定の列で文字列を置き換える方法は?

私は生物情報学を勉強していますが、長期的な経験がなく、詰まっていましたawk

13列のテーブルがあります。

ELL1-XXXXXXXXX列9には、()ELL1-II_EC_cell1またはCDK8-XXXXXX()などのさまざまな文字列バリアントがありますCDK8-213_mCdk8_ChIPseq_Tnaive_stim_CDK8-214_mCdk8_ChIPseq_Tnaive_stim_AS

変更しELL1-XXXXXたい文字列バリアントが200個を超え、他の文字列もより単純な文字列に変更したいと思います。ELL1CDK8

頑張った

awk -F '\t' '{gsub("CDK8-213_mCdk8_ChIPseq_Tnaive_stim_CDK8-214_mCdk8_ChIPseq_Tnaive_stim_AS","CDK8",$9); print}' input.lst > output.lst && mv output.lst input.lst

ところで、その文字列を一つずつ見つけて置き換えなければなりません。私はたくさんのフォーラムスレッドを読みましたが、私のファイルで動作するコマンドが見つかりませんでした。

以下は、入力として使用される4つのサンプルラインです。

DRX154054   ILLUMINA    SINGLE  ChIP-seq    mm_embryonicstemcell_embryonicstemcell  Mus_musculus    None    No  ELL1-II_EC_cell121  NA  NA  NA  ftp://ftp-trace.ncbi.nlm.nih.gov/sra/sra-instant/reads/ByExp/sra/DRX/DRX154/DRX154054/  
DRX154053   ILLUMINA    SINGLE  ChIP-seq    mm_embryonicstemcell_embryonicstemcell  Mus_musculus    None    No  ELL2-II_EC_cell210  NA  NA  NA  ftp://ftp-trace.ncbi.nlm.nih.gov/sra/sra-instant/reads/ByExp/sra/DRX/DRX154/DRX154053/  
ERX3608304  ILLUMINA    SINGLE  ChIP-Seq    mm_Unknown_Unknown  Mus_musculus    None    No  EP1-BCL6-Fast-C57-Rep1-ChIP-seq NA  NA  NA  ftp://ftp-trace.ncbi.nlm.nih.gov/sra/sra-instant/reads/ByExp/sra/ERX/ERX360/ERX3608304/ 
DRX154052   ILLUMINA    SINGLE  ChIP-seq    mm_embryonicstemcell_embryonicstemcell  Mus_musculus    None    No  DNMT3A-Dnmt3a1_BioChIPSeq_r1    NA  NA  NA  ftp://ftp-trace.ncbi.nlm.nih.gov/sra/sra-instant/reads/ByExp/sra/DRX/DRX154/DRX154052/  

予想出力:

DRX154054   ILLUMINA    SINGLE  ChIP-seq    mm_embryonicstemcell_embryonicstemcell  Mus_musculus    None    No  ELL1    NA  NA  NA  ftp://ftp-trace.ncbi.nlm.nih.gov/sra/sra-instant/reads/ByExp/sra/DRX/DRX154/DRX154054/  
DRX154053   ILLUMINA    SINGLE  ChIP-seq    mm_embryonicstemcell_embryonicstemcell  Mus_musculus    None    No  ELL2    NA  NA  NA  ftp://ftp-trace.ncbi.nlm.nih.gov/sra/sra-instant/reads/ByExp/sra/DRX/DRX154/DRX154053/
ERX3608304  ILLUMINA    SINGLE  ChIP-Seq    mm_Unknown_Unknown  Mus_musculus    None    No  EP1 NA  NA  NA  ftp://ftp-trace.ncbi.nlm.nih.gov/sra/sra-instant/reads/ByExp/sra/ERX/ERX360/ERX3608304/ 
DRX154052   ILLUMINA    SINGLE  ChIP-seq    mm_embryonicstemcell_embryonicstemcell  Mus_musculus    None    No  DNMT3A  NA  NA  NA  ftp://ftp-trace.ncbi.nlm.nih.gov/sra/sra-instant/reads/ByExp/sra/DRX/DRX154/DRX154052/  

ご覧のとおり、次の文字列が置き換えられました。

ELL1-II_EC_cell121 -> ELL1

ELL2-II_EC_cell210 -> ELL2

EP1-BCL6-Fast-C57-Rep1-ChIP-seq -> EP1

DNMT3A-Dnmt3a1_BioChIPSeq_r1 -> DNMT3A

ベストアンサー1

タブで区切られたデータを想定すると、次のようになります。

$ awk -F '\t' -v OFS='\t' '{ sub("-.*", "", $9); print }' file
DRX154054       ILLUMINA        SINGLE  ChIP-seq        mm_embryonicstemcell_embryonicstemcell  Mus_musculusNone     No      ELL1    NA      NA      NA      ftp://ftp-trace.ncbi.nlm.nih.gov/sra/sra-instant/reads/ByExp/sra/DRX/DRX154/DRX154054/
DRX154053       ILLUMINA        SINGLE  ChIP-seq        mm_embryonicstemcell_embryonicstemcell  Mus_musculusNone     No      ELL2    NA      NA      NA      ftp://ftp-trace.ncbi.nlm.nih.gov/sra/sra-instant/reads/ByExp/sra/DRX/DRX154/DRX154053/
ERX3608304      ILLUMINA        SINGLE  ChIP-Seq        mm_Unknown_Unknown      Mus_musculus    None    No  EP1      NA      NA      NA      ftp://ftp-trace.ncbi.nlm.nih.gov/sra/sra-instant/reads/ByExp/sra/ERX/ERX360/ERX3608304/
DRX154052       ILLUMINA        SINGLE  ChIP-seq        mm_embryonicstemcell_embryonicstemcell  Mus_musculusNone     No      DNMT3A  NA      NA      NA      ftp://ftp-trace.ncbi.nlm.nih.gov/sra/sra-instant/reads/ByExp/sra/DRX/DRX154/DRX154052/

これは、9番目のフィールドに置換を適用するだけで、最初のダッシュ文字で始まるフィールドのすべての項目を削除します。その後、変更されたデータを印刷します。

正規表現は-.*最初の項目から始まり-(文字通り「aの-後に0個以上の文字が続きます」)、sub()9番目のフィールドに空の置換文字列を使用すると、そのフィールドのすべてのテキスト一致が削除されます。gsub()入力ラインごとに1つの交換を実行するだけで、ここではそれを使用する必要はありません。

フィールドの1つを変更したので、出力フィールド区切り記号()がタブに設定されていることも確認する必要があります。OFSそれ以外の場合は、出力にスペースで区切られたフィールドが表示されます。明らかに、ブロックを使用してこれを行うこともできますBEGIN

awk 'BEGIN { OFS=FS="\t" } { sub("-.*", "", $9); print }' file

おすすめ記事