Awk
用另一個文件中的字元串列表根據匹配替換不同的字元串
我有一個帶有製表符分隔符的文件:
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