交换文件中的列位置

时间:2015-06-25 14:56:23

标签: python unix awk

我有一个看起来像这样的文件:

#name   cdsStart    cdsEnd  exonCount   exonStarts  exonEnds
NM_017436   431    586    3   420,440,513,    435,500,596,
NM_001173466    720    950    4    700,752,821,823,    721,760,900,973,

我想要分别将第2列和第3列中的数字换成第5列中的第一个数字和第6列中的最后一个数字。这是我想要的输出:

NM_017436   431    586    3   *431*,440,513,    435,500,*586*,
NM_001173466    720    950    4    *720*,752,821,823,    721,760,900,*950*,
为了清晰起见,我将输出文件中的更改用星号标记。我想到的是用这个脚本分割文件:

with open('nonsensepositions.txt') as inf:
    with open('nonsensepositions_split.txt', 'w') as outf:
        for line in inf:
            outf.write('\t'.join(line.split(',')))

然后尝试交换特定列,但我认为由于拆分后列的数量不同,这可能会很有挑战性。然后,我必须找出一种方法,使其在执行交换后显示为原始文件。有没有更简单的方法来执行这种类型的交换,还是我需要根据,分割文件并按照我的建议进行分割?

1 个答案:

答案 0 :(得分:2)

$ awk '{ sub(/^[0-9]+/,$2,$5); sub(/[0-9]+,$/,$3",",$6) } 1' file
#name   cdsStart    cdsEnd  exonCount   exonStarts  exonEnds
NM_017436 431 586 3 431,440,513, 435,500,586,
NM_001173466 720 950 4 720,752,821,823, 721,760,900,950,