Text-Processing

從每列的行中提取部分字元串

  • September 15, 2018

我有一個超過 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 的評論)。在這種情況下,請更新您的問題並進行澄清。

僅使用awkPOSIX 定義的結構,

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

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