使用awk编辑文本文件并创建新文件

时间:2018-02-08 11:11:24

标签: bash awk

我的文本文件就像一个小例子:

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.

但实际上我现在不知道如何应用我提到的两个条件(分割线条和删除不完整的线条)。你知道怎么做吗?

1 个答案:

答案 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