Text-Processing
使用同一行中的部分字元串替換字元串
我在 Linux 機器上有如下文件,gene_id 錯誤。所以我想
"PB"
用同一行的transcription_id 替換gene_id 中的字元串。$ cat try.gff transcript 30351 32332 . + . gene_id "PB"; transcript_id "PB.1.66"; exon 30351 31677 . + . gene_id "PB"; transcript_id "PB.1.59"; exon 31758 31871 . + . gene_id "PB"; transcript_id "PB.1.40"; exon 31968 32178 . + . gene_id "PB"; transcript_id "PB.1.30"; exon 32257 32332 . + . gene_id "PB"; transcript_id "PB.1.20"; transcript 30351 32332 . + . gene_id "PB"; transcript_id "PB.28.309"; exon 30351 31677 . + . gene_id "PB"; transcript_id "PB.58.900"; exon 31758 31871 . + . gene_id "PB"; transcript_id "PB.10000.1001"; exon 31968 32178 . + . gene_id "PB"; transcript_id "PB.19897.1087541"; exon 32257 32332 . + . gene_id "PB"; transcript_id "PB.1.11";
預期結果
transcript 30351 32332 . + . gene_id "PB.1"; transcript_id "PB.1.66"; exon 30351 31677 . + . gene_id "PB.1"; transcript_id "PB.1.59"; exon 31758 31871 . + . gene_id "PB.1"; transcript_id "PB.1.40"; exon 31968 32178 . + . gene_id "PB.1"; transcript_id "PB.1.30"; exon 32257 32332 . + . gene_id "PB.1"; transcript_id "PB.1.20"; transcript 30351 32332 . + . gene_id "PB.28"; transcript_id "PB.28.309"; exon 30351 31677 . + . gene_id "PB.58"; transcript_id "PB.58.900"; exon 31758 31871 . + . gene_id "PB.10000"; transcript_id "PB.10000.1001"; exon 31968 32178 . + . gene_id "PB.19897"; transcript_id "PB.19897.1087541"; exon 32257 32332 . + . gene_id "PB.1"; transcript_id "PB.1.11";
我設法用程式碼替換了正確的文本
awk -F";" '{gsub(" transcript_id ","");print $2}' try.gff | sed 's/"//g' | cut -d '.' -f 1,2
PB.1 PB.1 PB.1 PB.1 PB.1 PB.28 PB.58 PB.10000 PB.19897 PB.1
但我不知道如何替換gene_id 部分中的PB。能否請你幫忙?謝謝!
sed
在每個 Unix 機器上的任何 shell 中使用 any :$ sed 's/\(.*gene_id "\)[^"]*\(.*"\([^.]*\.[^.]*\).*\)/\1\3\2/' try.gff transcript 30351 32332 . + . gene_id "PB.1"; transcript_id "PB.1.66"; exon 30351 31677 . + . gene_id "PB.1"; transcript_id "PB.1.59"; exon 31758 31871 . + . gene_id "PB.1"; transcript_id "PB.1.40"; exon 31968 32178 . + . gene_id "PB.1"; transcript_id "PB.1.30"; exon 32257 32332 . + . gene_id "PB.1"; transcript_id "PB.1.20"; transcript 30351 32332 . + . gene_id "PB.28"; transcript_id "PB.28.309"; exon 30351 31677 . + . gene_id "PB.58"; transcript_id "PB.58.900"; exon 31758 31871 . + . gene_id "PB.10000"; transcript_id "PB.10000.1001"; exon 31968 32178 . + . gene_id "PB.19897"; transcript_id "PB.19897.1087541"; exon 32257 32332 . + . gene_id "PB.1"; transcript_id "PB.1.11";
在正則表達式部分中,每個都
\(
啟動了一個由匹配終止的擷取組\)
。在替換部分中,every\<digit>
指的是與擷取組中的正則表達式段匹配的字元串。so\1
指的是匹配的字元串\(.*gene_id "\)
等等。其餘的只是基本的正則表達式段(例如.*
,表示任何字元的 0 次或多次重複,[^"]*
表示除 之外的任何字元的 0 次或多次重複"
,並\.
表示文字.
)。