Awk

用另一個文件中的字元串列表根據匹配替換不同的字元串

  • October 18, 2018

我有一個帶有製表符分隔符的文件:

Chr1    mak   gene    120221  120946  .       +       .       ID=spa-h0003.02;Name=spa-h0003.02
Chr1    mak   mRNA    120221  120946  .       +       .       ID=spa-cap_Chr1_00M;Parent=spa-h0003.02;Name=spa-cap_Chr1_00M
Chr1    mak   exon    120221  120946  .       +       .       Parent=spa-cap_Chr1_00M
Chr1    mak   gene    18546165        18546939        .       +       .       ID=spa-h0004.02;Name=spa-h0004.02
Chr1    mak   mRNA    18546165        18546939        .       +       .       ID=spa-cap_Chr1_18;Parent=spa-h0004.02;Name=spa-cap_Chr1_18
Chr1    mak   exon    18546165        18546504        .       +       .       Parent=spa-cap_Chr1_18
Chr1    mak   exon    18546791        18546939        .       +       .       Parent=spa-cap_Chr1_18

只有當第三列有“基因”時,我才想替換不同的字元串。但是第 9 列的字元串應該根據第二個文件中的資訊來替換,比如這個文件(帶有標籤):

spa-h0003.02  spa-cap_Chr1_00M
spa-h0004.02  spa-cap_Chr1_18

我不知道該怎麼做。我在想類似的東西(XX應該是第二個文件中的資訊?):

cat file | awk '$3 == "gene" && $9 == "spa-" {$9 = "XX"} {print}' 

但是我如何使用第二個文件中的資訊呢?也許:

while read n k; do sed -i 's/$n/$k/g' file1; done < fileA

假設file1包含要替換的文本,file2包含替換文本,並且您可以依靠ID=來執行兩者之間的查找,您可以使用這個(我猜更流行)awk 腳本:

awk -F'\t' '
 NR==FNR{
   a[$1]=$2                                   # fills the array a with the replacement text
   next
 }
 $3=="gene"{                                  # check only lines with 'gene'
   id=gensub("ID=([^;]*);.*","\\1",1,$9);     # extract the id string
   if(id in a)                                # if the id is part of the array a
      gsub(id,a[id])                          # replace it
 }
 1                                            # print the line
' file2 file1

引用自:https://unix.stackexchange.com/questions/476340