我的文本文件就像一个小例子:
ENSG00000001036 ENST00000002165 6 143832827 143832772
ENSG00000001461 ENST00000003912 1 24766730;24746130;24768628;24742394;24759703 24766662;24745781;24768545;24742293;24759594
ENSG00000004139 ENST00000003834 17
ENSG00000001460 ENST00000003583 1 24740215;24727946 24740164;24727857
我想编辑文件并制作新文件。事实上,第一行是好的,其他行应该看起来像这样。在第3行我没有字段4和5所以我将完全删除这些行。但是在示例中有一些像第3行和第4行的行。在这些第4和第5行中;
分开。我想根据;
个分开的部分的数量将这些行划分为多个。例如,第二行将被转换为5行,第4行将被分成2行。新行将具有相同的第1列,第2列和第3列,但不同之处在于第4列和第5列。这是第4行中的2个新结果行。
ENSG00000001460 ENST00000003583 1 24740215 24740164
ENSG00000001460 ENST00000003583 1 24727946 24727857
如上面2行所示,字段编号4和5的第1列是第1个新行中的字段编号4和5,字段编号4和5的第2列是第2个新行中的第4和第5个字段。所以小例子的结果看起来像这样:
ENSG00000001036 ENST00000002165 6 143832827 143832772
ENSG00000001461 ENST00000003912 1 24766730 24766662
ENSG00000001461 ENST00000003912 1 24746130 24745781
ENSG00000001461 ENST00000003912 1 24768628 24768545
ENSG00000001461 ENST00000003912 1 24742394 24742293
ENSG00000001461 ENST00000003912 1 24759703 24759594
ENSG00000001460 ENST00000003583 1 24740215 24740164
ENSG00000001460 ENST00000003583 1 24727946 24727857
我使用awk
编写了一个小代码:
awk -F";" '{print $1 "\t" $2 "\t" $3 "\t" $4 "\t" $5}' coord.txt > new.txt.
但实际上我现在不知道如何应用我提到的两个条件(分割线条和删除不完整的线条)。你知道怎么做吗?
答案 0 :(得分:2)
您可以在awk
的第四和第五栏中使用此split
命令和semi-colon
:
awk 'NF==5{n=split($4, a, /;/); split($5, b, /;/);
for(i=1; i<=n; i++) print $1, $2, $3, a[i], b[i]}' file
ENSG00000001036 ENST00000002165 6 143832827 143832772
ENSG00000001461 ENST00000003912 1 24766730 24766662
ENSG00000001461 ENST00000003912 1 24746130 24745781
ENSG00000001461 ENST00000003912 1 24768628 24768545
ENSG00000001461 ENST00000003912 1 24742394 24742293
ENSG00000001461 ENST00000003912 1 24759703 24759594
ENSG00000001460 ENST00000003583 1 24740215 24740164
ENSG00000001460 ENST00000003583 1 24727946 24727857