Awk: от CSV до PDB (банк данных белка) - PullRequest
0 голосов
/ 21 декабря 2018

У меня есть файл CSV в этом формате:

ATOM,3662,H,VAL,A,257,6.111,31.650,13.338,1.00,0.00,H
ATOM,3663,HA,VAL,A,257,3.180,31.995,13.768,1.00,0.00,H
ATOM,3664,HB,VAL,A,257,4.726,32.321,11.170,1.00,0.00,H
ATOM,3665,HG11,VAL,A,257,2.387,31.587,10.892,1.00,0.00,H

И я хотел бы отформатировать его в соответствии со стандартами PDB (фиксированная позиция):

ATOM   3662  H   VAL A 257       6.111  31.650  13.338  1.00  0.00           H

ATOM   3663  HA  VAL A 257       3.180  31.995  13.768  1.00  0.00           H

ATOM   3664  HB  VAL A 257       4.726  32.321  11.170  1.00  0.00           H

ATOM   3665 HG11 VAL A 257       2.387  31.587  10.892  1.00  0.00           H

Можно считать, чтовсе правильно, кроме первого и третьего столбца.Первое не проблема.Третий, однако, он выравнивается по левому краю, когда его длина составляет 1-3, но смещен на одну позицию влево, когда он равен 4.

У меня есть один вкладыш AWK, который почти добивается цели:

awk -F, 'BEGIN {OFS=FS} {if(length($3) == 4 ) {pad=" "} else {pad="  "}} {printf "%-6s%5s%s%-4s%4s%2s%4s%11s%8s%8s%6s%6s%12s\n", $1, $2, $pad, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12}' < 1iy8_min.csv

За исключением двух вещей:

  1. Исключение из третьего столбца.Я думал о добавлении условия, которое изменяет заполнение перед третьим столбцом в соответствии с длиной поля, но я не могу заставить его работать (идея проиллюстрирована в приведенном выше одноместном выражении).

  2. Другая проблема заключается в том, что если между полями нет пробелов, заполнение не работает вообще.

    ATOM   3799  HH   TYR A 267     -5.713  16.149  26.838  1.00  0.00           H
    
    HETATM 3801  O7N  NADA12688.285     19.839  10.489    1.00 20.51     O   
    

В приведенном выше примере вторая строка должна быть:

HETATM 3801  O7N  NAD A1268      8.285  19.839  10.489  1.00 20.51           O

Но поскольку между полями 5 и 6 нет пробела, все перемешивается.Кажется, что A1268 воспринимается как одно поле.Возможно, потому что по умолчанию разделитель awk кажется пустым пространством.Можно ли сделать его зависимым от позиции?

ОБНОВЛЕНИЕ: Следующее решает проблему с исключением в третьем столбце:

awk 'BEGIN {FS = ",";OFS = ""} { if(length($3) == 4 ) {pad = sprintf("%s", " ")} else {pad = sprintf("%2s", " ")} } { if(length($3) == 4 ) {pad2 = sprintf("%s", " ")} else {pad2 = sprintf("%s", "")} } {printf "%-6s%5s%s%-4s%s%3s%2s%4s%11s%8s%8s%6s%6s%12s\n", $1, $2, pad, $3, pad2, $4, $5, $6, $7, $8, $9, $10, $11, $12}' 1iy8_min.csv

Однако OFS, похоже, игнорируется ...

UPDATE2: проблема была во входном файле.Извини за это.Решено.

Рабочий скрипт:

awk 'BEGIN{OFS=FS=","}{$7=sprintf("%.3f",$7)}1{$8=sprintf("%.3f",$8)}1{$9=sprintf("%.3f",$9)}1' ${file} | awk 'BEGIN {FS =","; OFS=""} { if(length($3) == 4 ) {pad = sprintf("%s", " ")} else {pad = sprintf("%2s", " ")} } { if(length($3) == 4 ) {pad2 = sprintf("%s", " ")} else {pad2 = sprintf("%s", "")} } {printf "%-6s%5s%s%-4s%s%3s%2s%4s%12s%8s%8s%6s%6s%12s\n", $1, $2, pad, $3, pad2, $4, $5, $6, $7, $8, $9, $10, $11, $12}' > ${root}_csv.pdb
...