awk:使用选项卡更改空格,将标题和空字段考虑在内

时间:2014-12-03 05:54:31

标签: awk tabs

我有一个空格分隔的文件,我想将其转换为制表符分隔文件。该文件如下所示:

pos    peptide      logscore affinity(nM) Bind Level    Protein Name     Allele
0   GPSGGQPX         0.075        22266                          1 HLA-A11:01
0   PSGGQPXA         0.071        23285                          2 HLA-A11:01
0   SGGQPXAL         0.076        21945                          3 HLA-A11:01
0   GGQPXALD         0.076        21858                          4 HLA-A11:01
0   GQPXALDS         0.075        22237                          5 HLA-A11:01
0   QPXALDSG         0.073        22748                          6 HLA-A11:01
0   PXALDSGY         0.072        22962                          7 HLA-A11:01
0   XALDSGYD         0.080        21133                          8 HLA-A11:01
0   DTSMKDMH         0.093        18194                          9 HLA-A11:01
0   TSMKDMHK         0.732           18         SB              10 HLA-A11:01
0   SMKDMHKV         0.099        17148                         11 HLA-A11:01
0   MKDMHKVL         0.071        23175                         12 HLA-A11:01
0   KDMHKVLR         0.135        11550                         13 HLA-A11:01
0   DMHKVLRT         0.074        22537                         14 HLA-A11:01
0   MHKVLRTL         0.072        23056                         15 HLA-A11:01
0   HKVLRTLQ         0.069        23819                         16 HLA-A11:01
0   DTSMKDMH         0.093        18194                         17 HLA-A11:01
0   TSMKDMHK         0.732           18         SB              18 HLA-A11:01
0   SMKDMHKV         0.099        17148                         19 HLA-A11:01
0   MKDMHKVL         0.071        23175                         20 HLA-A11:01

我必须用一个标签替换空格,并考虑到:

  1. " Bind Name"和蛋白质名称"蛋白质名称"在标题行;他们应该重命名" Bind.Level"和" Protein.Name"代替。
  2. 两个标签,而不是仅仅1(或#34; - "或中间的NA),在关联字段和Bind.Level为空的条目中的Protein.Name字段之间,以保留此类该字段中的空条目。
  3. 因此,仅仅以下内容还不够:

     awk '{$1=$1}1' OFS="\t" file
    

    有没有一种简单的方法可以用单线程来实现这一点,最好是awk?

    修改

    这是输出的样子,注意" Bind.Level"和" Protein.Name"在标题中," - " (在空Bind.Level记录中可以是NA或"")

    pos peptide logscore    affinity(nM)    Bind.Level  Protein.Name    Allele
    0   GPSGGQPX    0.075   22266   -   1   HLA-A11:01
    0   PSGGQPXA    0.071   23285   -   2   HLA-A11:01
    0   SGGQPXAL    0.076   21945   -   3   HLA-A11:01
    0   GGQPXALD    0.076   21858   -   4   HLA-A11:01
    0   GQPXALDS    0.075   22237   -   5   HLA-A11:01
    0   QPXALDSG    0.073   22748   -   6   HLA-A11:01
    0   PXALDSGY    0.072   22962   -   7   HLA-A11:01
    0   XALDSGYD    0.080   21133   -   8   HLA-A11:01
    0   DTSMKDMH    0.093   18194   -   9   HLA-A11:01
    0   TSMKDMHK    0.732   18  SB  10  HLA-A11:01
    0   SMKDMHKV    0.099   17148   -   11  HLA-A11:01
    0   MKDMHKVL    0.071   23175   -   12  HLA-A11:01
    0   KDMHKVLR    0.135   11550   -   13  HLA-A11:01
    0   DMHKVLRT    0.074   22537   -   14  HLA-A11:01
    0   MHKVLRTL    0.072   23056   -   15  HLA-A11:01
    0   HKVLRTLQ    0.069   23819   -   16  HLA-A11:01
    0   DTSMKDMH    0.093   18194   -   17  HLA-A11:01
    0   TSMKDMHK    0.732   18  SB  18  HLA-A11:01
    0   SMKDMHKV    0.099   17148   -   19  HLA-A11:01
    0   MKDMHKVL    0.071   23175   -   20  HLA-A11:01
    

    请注意,非空Bind.Level记录可能采用不同的值,而不仅仅是" SB" ...但所有这些都是字母... Protein.Name可能并不总是数字,但..

    这类似于识别由\ s +分隔的字段;然后,如果有7个字段,则打印它们(由制表符分隔),如果有6个(Bind.Level为空),则打印$ 1,$ 2,$ 3,$ 4," - ",$ 5 ,6美元。 Protein.names可能包含空格,但我要确保它们不是(它们是输入)。这应该是超级简单的,但我不知道怎么做......任何人?

2 个答案:

答案 0 :(得分:0)

以下是使用gnu awk

处理字段的方法
awk -vFIELDWIDTHS="4 17 13 14 16 13" '{for (i=1;i<=NF;i++) gsub(/ +|\t+/,"",$i);$5=$5?$5:"-";print }' file
pos peptidel ogscoreaffin ity(nM)BindL evelProtein NameAlle
0 GPSGGQPX 0.075 22266 - 1HLA-A11:01
0 PSGGQPXA 0.071 23285 - 2HLA-A11:01
0 SGGQPXAL 0.076 21945 - 3HLA-A11:01
0 GGQPXALD 0.076 21858 - 4HLA-A11:01
0 GQPXALDS 0.075 22237 - 5HLA-A11:01
0 QPXALDSG 0.073 22748 - 6HLA-A11:01
0 PXALDSGY 0.072 22962 - 7HLA-A11:01
0 XALDSGYD 0.080 21133 - 8HLA-A11:01
0 DTSMKDMH 0.093 18194 - 9HLA-A11:01
0 TSMKDMHK 0.732 18 SB 10HLA-A11:01
0 SMKDMHKV 0.099 17148 - 11HLA-A11:01
0 MKDMHKVL 0.071 23175 - 12HLA-A11:01
0 KDMHKVLR 0.135 11550 - 13HLA-A11:01
0 DMHKVLRT 0.074 22537 - 14HLA-A11:01
0 MHKVLRTL 0.072 23056 - 15HLA-A11:01
0 HKVLRTLQ 0.069 23819 - 16HLA-A11:01
0 DTSMKDMH 0.093 18194 - 17HLA-A11:01
0 TSMKDMHK 0.732 18 SB 18HLA-A11:01
0 SMKDMHKV 0.099 17148 - 19HLA-A11:01
0 MKDMHKVL 0.071 23175 - 20HLA-A11:01

awk -vFIELDWIDTHS="4 17 13 14 16 13" '{for (i=1;i<=NF;i++) gsub(/ +|\t+/,"",$i);$5=$5?$5:"-";print}' file | column -t
pos  peptidel  ogscoreaffin  ity(nM)BindL  evelProtein  NameAlle
0    GPSGGQPX  0.075         22266         -            1HLA-A11:01
0    PSGGQPXA  0.071         23285         -            2HLA-A11:01
0    SGGQPXAL  0.076         21945         -            3HLA-A11:01
0    GGQPXALD  0.076         21858         -            4HLA-A11:01
0    GQPXALDS  0.075         22237         -            5HLA-A11:01
0    QPXALDSG  0.073         22748         -            6HLA-A11:01
0    PXALDSGY  0.072         22962         -            7HLA-A11:01
0    XALDSGYD  0.080         21133         -            8HLA-A11:01
0    DTSMKDMH  0.093         18194         -            9HLA-A11:01
0    TSMKDMHK  0.732         18            SB           10HLA-A11:01
0    SMKDMHKV  0.099         17148         -            11HLA-A11:01
0    MKDMHKVL  0.071         23175         -            12HLA-A11:01
0    KDMHKVLR  0.135         11550         -            13HLA-A11:01
0    DMHKVLRT  0.074         22537         -            14HLA-A11:01
0    MHKVLRTL  0.072         23056         -            15HLA-A11:01
0    HKVLRTLQ  0.069         23819         -            16HLA-A11:01
0    DTSMKDMH  0.093         18194         -            17HLA-A11:01
0    TSMKDMHK  0.732         18            SB           18HLA-A11:01
0    SMKDMHKV  0.099         17148         -            19HLA-A11:01
0    MKDMHKVL  0.071         23175         -            20HLA-A11:01

通过这种方式,您可以按照自己的方式对其进行格式化,因为您可以控制哪些字段的大小。

答案 1 :(得分:0)

分2步完成,第一步在空Binding.Level记录和“。”中添加“ - ”。在正确的标题名称中,以及从空格更改为制表符的第二步:

 awk 'BEGIN{FS="";OFS=FS};($50==" "){$50="-"};(NR==1){$47="."; $64="."}{print}' file > out1
 awk '{$1=$1}1' OFS="\t" out1 > out2