Text-Processing
從每列的行中提取部分字元串
我有一個超過 20.000 行的文本文件,如下所示:
7 128550681 128550681 Intron:1:36:RETAINED-RETAINED;Transcript:NM_001135914.1;Gene:KCP:protein_coding 1 1 0 0 1 17718672 17718672 Intron:9:16:RETAINED-RETAINED;Transcript:NM_207421.4;Gene:PADI6:protein_coding 1 1 0 0 1 17718672 17718672 Intron:9:16:RETAINED-RETAINED;Transcript:NM_207421.4;Gene:PADI6:protein_coding 1 1 0 0 4 86035 86035 Exon:4:5:RETAINED;Transcript:NM_001286052.1;Gene:ZNF595:protein_coding 1 1 0 0 3 12942851 12942851 Intron:14:14:SKIPPED-ALTTENATIVE_3SS;Transcript:NM_001134382.2;Gene:IQSEC1:protein_coding 1 1 0 0
我需要的是第 4 列只包含 Gene:genename,所以輸出是這樣的:
7 128550681 128550681 Gene:KCP 1 1 0 0 1 17718672 17718672 Gene:PADI6 1 1 0 0 1 17718672 17718672 Gene:PADI6 1 1 0 0 4 86035 86035 Gene:ZNF595 1 1 0 0 3 12942851 12942851 Gene:IQSEC1 1 1 0 0
*
Gene:genename
嘗試拆分時,問題並不總是在同一:
位置;
我知道非常基本的 awk/sed,例如如何選擇特定列,如何 grep 包含某些模式的行
我能夠使用以下
awk
命令完成此操作:awk '{sub(/^.*;/,"",$4); print}' input
這將刪除第 4 列中的所有內容,直到最後
;
一個可能對您不起作用(請參閱 Steeldriver 的評論)。在這種情況下,請更新您的問題並進行澄清。
僅使用
awk
POSIX 定義的結構,awk 'match($4, /Gene:(.+)\:/){ $4=substr($4, RSTART, RLENGTH-1) }1' file
為了使輸出更整齊地對齊,將輸出通過管道
| column -t
分隔您的列。如果您不確定 行中的位置,Gene:genename
請更改awk
以在行中的任何位置查找模式,並使用所需值修改第 4 列。更改為$4
($0
整行)應該可以正常工作。awk 'match($0, /Gene:(.+)\:/){ $4=substr($0, RSTART, RLENGTH-1) }1' file