#awk #pdb-files
#awk #pdb-файлы
Вопрос:
Мне нужно сопоставить столбцы 1 и 2 из ori_file2.pdb со столбцами 1 и 2 из new_file1.pdb. Если они совпадают, замените столбцы 3,4,5 и 6 в new_file1.pdb данными из тех же столбцов в ori_file2.pdb, не изменяя пробелы между столбцами в new_file1.pdb.
ori_file2.pdb
HELIX 1 1 PHE A 2 ALA A 7 1 6
ATOM 1 N PHE A 1 -3.631 -3.776 -2.910 1.00 0.00 N
ATOM 2 CA PHE A 1 -2.182 -3.776 -2.910 1.00 0.00 C
ATOM 3 C PHE A 1 -1.659 -2.347 -2.910 1.00 0.00 C
ATOM 4 O PHE A 1 -0.766 -2.011 -2.135 1.00 0.00 O
ATOM 5 CB PHE A 1 -1.630 -4.477 -4.142 1.00 0.00 C
ATOM 6 CG PHE A 1 -1.888 -5.964 -4.196 1.00 0.00 C
ATOM 7 CD2 PHE A 1 -1.053 -6.844 -3.498 1.00 0.00 C
ATOM 8 CD1 PHE A 1 -2.962 -6.461 -4.943 1.00 0.00 C
ATOM 9 CE1 PHE A 1 -3.201 -7.840 -4.993 1.00 0.00 C
ATOM 10 CZ PHE A 1 -2.366 -8.721 -4.295 1.00 0.00 C
ATOM 11 CE2 PHE A 1 -1.292 -8.223 -3.548 1.00 0.00 C
ATOM 12 N PHE A 2 -2.218 -1.506 -3.783 1.00 0.00 N
ATOM 13 CA PHE A 2 -1.808 -0.119 -3.881 1.00 0.00 C
ATOM 14 C PHE A 2 -1.962 0.568 -2.532 1.00 0.00 C
new_file1.pdb
MODEL 1
COMPND UNNAMED
AUTHOR GENERATED BY OPEN BABEL 2.3.90
ATOM 1 N LIG L 2 -28.497 -21.375 1.835 1.00 0.00 N
ATOM 2 C LIG L 2 -27.282 -21.191 1.068 1.00 0.00 C
ATOM 3 C LIG L 2 -27.048 -22.391 0.162 1.00 0.00 C
ATOM 4 O LIG L 2 -26.148 -23.191 0.408 1.00 0.00 O
ATOM 5 C LIG L 2 -26.071 -21.047 1.977 1.00 0.00 C
ATOM 6 C LIG L 2 -26.119 -19.866 2.917 1.00 0.00 C
ATOM 7 C LIG L 2 -26.393 -20.064 4.275 1.00 0.00 C
ATOM 8 C LIG L 2 -25.887 -18.575 2.430 1.00 0.00 C
ATOM 9 C LIG L 2 -25.932 -17.479 3.301 1.00 0.00 C
ATOM 10 C LIG L 2 -26.206 -17.677 4.660 1.00 0.00 C
ATOM 11 C LIG L 2 -26.438 -18.969 5.147 1.00 0.00 C
ATOM 12 N LIG L 2 -27.862 -22.514 -0.889 1.00 0.00 N
ATOM 13 C LIG L 2 -27.742 -23.613 -1.826 1.00 0.00 C
ATOM 14 C LIG L 2 -26.824 -23.222 -2.975 1.00 0.00 C
Я выполнил приведенный ниже код
enter code here awk ' FNR==NR {
split($0,a,/[[:space:]]*/)
b[a[2]]=a[1]
next
}
{
n=split($0,d,/[^[:space:]]*/)
if(b[$2])
$3=b[$3]
for(i=1;i<=n;i )
printf("%s%s",d[i],$i)
print ""
}' ori_file2.pdb new_file1.pdb
Получил этот результат
ATOM 1 ATOM LIG L 2 -28.497 -21.375 1.835 1.00 0.00 N
ATOM 2 ATOM LIG L 2 -27.282 -21.191 1.068 1.00 0.00 C
ATOM 3 ATOM LIG L 2 -27.048 -22.391 0.162 1.00 0.00 C
ATOM 4 ATOM LIG L 2 -26.148 -23.191 0.408 1.00 0.00 O
ATOM 5 ATOM LIG L 2 -26.071 -21.047 1.977 1.00 0.00 C
ATOM 6 ATOM LIG L 2 -26.119 -19.866 2.917 1.00 0.00 C
ATOM 7 ATOM LIG L 2 -26.393 -20.064 4.275 1.00 0.00 C
ATOM 8 ATOM LIG L 2 -25.887 -18.575 2.430 1.00 0.00 C
ATOM 9 ATOM LIG L 2 -25.932 -17.479 3.301 1.00 0.00 C
ATOM 10 ATOM LIG L 2 -26.206 -17.677 4.660 1.00 0.00 C
ATOM 11 ATOM LIG L 2 -26.438 -18.969 5.147 1.00 0.00 C
ATOM 12 ATOM LIG L 2 -27.862 -22.514 -0.889 1.00 0.00 N
ATOM 13 ATOM LIG L 2 -27.742 -23.613 -1.826 1.00 0.00 C
ATOM 14 ATOM LIG L 2 -26.824 -23.222 -2.975 1.00 0.00 C
Однако это желаемый результат
MODEL 1
COMPND UNNAMED
AUTHOR GENERATED BY OPEN BABEL 2.3.90
ATOM 1 N PHE A 1 -28.497 -21.375 1.835 1.00 0.00 N
ATOM 2 CA PHE A 1 -27.282 -21.191 1.068 1.00 0.00 C
ATOM 3 C PHE A 1 -27.048 -22.391 0.162 1.00 0.00 C
ATOM 4 O PHE A 1 -26.148 -23.191 0.408 1.00 0.00 O
ATOM 5 CB PHE A 1 -26.071 -21.047 1.977 1.00 0.00 C
ATOM 6 CG PHE A 1 -26.119 -19.866 2.917 1.00 0.00 C
ATOM 7 CD2 PHE A 1 -26.393 -20.064 4.275 1.00 0.00 C
ATOM 8 CD1 PHE A 1 -25.887 -18.575 2.430 1.00 0.00 C
ATOM 9 CE1 PHE A 1 -25.932 -17.479 3.301 1.00 0.00 C
ATOM 10 CZ PHE A 1 -26.206 -17.677 4.660 1.00 0.00 C
ATOM 11 CE2 PHE A 1 -26.438 -18.969 5.147 1.00 0.00 C
ATOM 12 N PHE A 2 -27.862 -22.514 -0.889 1.00 0.00 N
ATOM 13 CA PHE A 2 -27.742 -23.613 -1.826 1.00 0.00 C
ATOM 14 C PHE A 2 -26.824 -23.222 -2.975 1.00 0.00 C
Я хотел бы сохранить файловую структуру file2 для последующего анализа.
Ответ №1:
Если вы не беспокоитесь о сохранении интервала, то :
Однострочный:
awk 'FNR==NR{a[$1,$2]=$3 FS $4 FS $5 FS $6;next}(($1,$2) in a){split(a[$1,$2],t);$3=t[1];$4=t[2];$5=t[3];$6=t[4]}1' ori_file2.pub ori_file1.pub
С .. | column -t
[akshay@db1 tmp]$ awk 'FNR==NR{a[$1,$2]=$3 FS $4 FS $5 FS $6;next}(($1,$2) in a){split(a[$1,$2],t);$3=t[1];$4=t[2];$5=t[3];$6=t[4]}1' ori_file2.pub ori_file1.pub | column -t
MODEL 1
COMPND UNNAMED
AUTHOR GENERATED BY OPEN BABEL 2.3.90
ATOM 1 N PHE A 1 -28.497 -21.375 1.835 1.00 0.00 N
ATOM 2 CA PHE A 1 -27.282 -21.191 1.068 1.00 0.00 C
ATOM 3 C PHE A 1 -27.048 -22.391 0.162 1.00 0.00 C
ATOM 4 O PHE A 1 -26.148 -23.191 0.408 1.00 0.00 O
ATOM 5 CB PHE A 1 -26.071 -21.047 1.977 1.00 0.00 C
ATOM 6 CG PHE A 1 -26.119 -19.866 2.917 1.00 0.00 C
ATOM 7 CD2 PHE A 1 -26.393 -20.064 4.275 1.00 0.00 C
ATOM 8 CD1 PHE A 1 -25.887 -18.575 2.430 1.00 0.00 C
ATOM 9 CE1 PHE A 1 -25.932 -17.479 3.301 1.00 0.00 C
ATOM 10 CZ PHE A 1 -26.206 -17.677 4.660 1.00 0.00 C
ATOM 11 CE2 PHE A 1 -26.438 -18.969 5.147 1.00 0.00 C
ATOM 12 N PHE A 2 -27.862 -22.514 -0.889 1.00 0.00 N
ATOM 13 CA PHE A 2 -27.742 -23.613 -1.826 1.00 0.00 C
ATOM 14 C PHE A 2 -26.824 -23.222 -2.975 1.00 0.00 C
Лучше читается:
awk 'FNR==NR{
a[$1,$2]=$3 FS $4 FS $5 FS $6;
next
}
(($1,$2) in a){
split(a[$1,$2],t);
$3=t[1]; $4=t[2]; $5=t[3]; $6=t[4]
}1
' ori_file2.pub ori_file1.pub
Чтобы сохранить интервал :
awk 'FNR==NR{
a[$1,$2]=$3 FS $4 FS $5 FS $6;
next
}
(($1,$2) in a){
n=split($0,arr,FS,d);
split(a[$1,$2],t);
$3=t[1];$4=t[2];$5=t[3];$6=t[4];
for(i=1;i<=n;i )
printf "%s%s", $(i),(i<n? d[i] : ORS);
next
}1
' ori_file2.pub ori_file1.pub
Или даже
GNU awk (протестировано на GNU Awk 4.2.1
):
awk 'FNR==NR{
a[$1,$2]=$3 FS $4 FS $5 FS $6;
next
}
(($1,$2) in a){
n=patsplit($0, arr, FPAT, d);
split(a[$1,$2],t);
$3=t[1]; $4=t[2]; $5=t[3]; $6=t[4];
for(i=1;i<=n;i )
printf "%s%s", $(i),(i<n? d[i] : ORS);
next
}1
' ori_file2.pub ori_file1.pub
Результаты тестирования:
[akshay@db1 tmp]$ cat ori_file1.pub
MODEL 1
COMPND UNNAMED
AUTHOR GENERATED BY OPEN BABEL 2.3.90
ATOM 1 N LIG L 2 -28.497 -21.375 1.835 1.00 0.00 N
ATOM 2 C LIG L 2 -27.282 -21.191 1.068 1.00 0.00 C
ATOM 3 C LIG L 2 -27.048 -22.391 0.162 1.00 0.00 C
ATOM 4 O LIG L 2 -26.148 -23.191 0.408 1.00 0.00 O
ATOM 5 C LIG L 2 -26.071 -21.047 1.977 1.00 0.00 C
ATOM 6 C LIG L 2 -26.119 -19.866 2.917 1.00 0.00 C
ATOM 7 C LIG L 2 -26.393 -20.064 4.275 1.00 0.00 C
ATOM 8 C LIG L 2 -25.887 -18.575 2.430 1.00 0.00 C
ATOM 9 C LIG L 2 -25.932 -17.479 3.301 1.00 0.00 C
ATOM 10 C LIG L 2 -26.206 -17.677 4.660 1.00 0.00 C
ATOM 11 C LIG L 2 -26.438 -18.969 5.147 1.00 0.00 C
ATOM 12 N LIG L 2 -27.862 -22.514 -0.889 1.00 0.00 N
ATOM 13 C LIG L 2 -27.742 -23.613 -1.826 1.00 0.00 C
ATOM 14 C LIG L 2 -26.824 -23.222 -2.975 1.00 0.00 C
[akshay@db1 tmp]$ cat ori_file2.pub
HELIX 1 1 PHE A 2 ALA A 7 1 6
ATOM 1 N PHE A 1 -3.631 -3.776 -2.910 1.00 0.00 N
ATOM 2 CA PHE A 1 -2.182 -3.776 -2.910 1.00 0.00 C
ATOM 3 C PHE A 1 -1.659 -2.347 -2.910 1.00 0.00 C
ATOM 4 O PHE A 1 -0.766 -2.011 -2.135 1.00 0.00 O
ATOM 5 CB PHE A 1 -1.630 -4.477 -4.142 1.00 0.00 C
ATOM 6 CG PHE A 1 -1.888 -5.964 -4.196 1.00 0.00 C
ATOM 7 CD2 PHE A 1 -1.053 -6.844 -3.498 1.00 0.00 C
ATOM 8 CD1 PHE A 1 -2.962 -6.461 -4.943 1.00 0.00 C
ATOM 9 CE1 PHE A 1 -3.201 -7.840 -4.993 1.00 0.00 C
ATOM 10 CZ PHE A 1 -2.366 -8.721 -4.295 1.00 0.00 C
ATOM 11 CE2 PHE A 1 -1.292 -8.223 -3.548 1.00 0.00 C
ATOM 12 N PHE A 2 -2.218 -1.506 -3.783 1.00 0.00 N
ATOM 13 CA PHE A 2 -1.808 -0.119 -3.881 1.00 0.00 C
ATOM 14 C PHE A 2 -1.962 0.568 -2.532 1.00 0.00 C
[akshay@db1 tmp]$ awk 'FNR==NR{
a[$1,$2]=$3 FS $4 FS $5 FS $6;
next
}
(($1,$2) in a){
n=split($0,arr,FS,d);
split(a[$1,$2],t);
$3=t[1];$4=t[2];$5=t[3];$6=t[4];
for(i=1;i<=n;i )
printf "%s%s", $(i),(i<n? d[i] : ORS);
next
}1
' ori_file2.pub ori_file1.pub
MODEL 1
COMPND UNNAMED
AUTHOR GENERATED BY OPEN BABEL 2.3.90
ATOM 1 N PHE A 1 -28.497 -21.375 1.835 1.00 0.00 N
ATOM 2 CA PHE A 1 -27.282 -21.191 1.068 1.00 0.00 C
ATOM 3 C PHE A 1 -27.048 -22.391 0.162 1.00 0.00 C
ATOM 4 O PHE A 1 -26.148 -23.191 0.408 1.00 0.00 O
ATOM 5 CB PHE A 1 -26.071 -21.047 1.977 1.00 0.00 C
ATOM 6 CG PHE A 1 -26.119 -19.866 2.917 1.00 0.00 C
ATOM 7 CD2 PHE A 1 -26.393 -20.064 4.275 1.00 0.00 C
ATOM 8 CD1 PHE A 1 -25.887 -18.575 2.430 1.00 0.00 C
ATOM 9 CE1 PHE A 1 -25.932 -17.479 3.301 1.00 0.00 C
ATOM 10 CZ PHE A 1 -26.206 -17.677 4.660 1.00 0.00 C
ATOM 11 CE2 PHE A 1 -26.438 -18.969 5.147 1.00 0.00 C
ATOM 12 N PHE A 2 -27.862 -22.514 -0.889 1.00 0.00 N
ATOM 13 CA PHE A 2 -27.742 -23.613 -1.826 1.00 0.00 C
ATOM 14 C PHE A 2 -26.824 -23.222 -2.975 1.00 0.00 C
[akshay@db1 tmp]$ awk 'FNR==NR{
a[$1,$2]=$3 FS $4 FS $5 FS $6;
next
}
(($1,$2) in a){
n=patsplit($0, arr, FPAT, d);
split(a[$1,$2],t);
$3=t[1]; $4=t[2]; $5=t[3]; $6=t[4];
for(i=1;i<=n;i )
printf "%s%s", $(i),(i<n? d[i] : ORS);
next
}1
' ori_file2.pub ori_file1.pub
MODEL 1
COMPND UNNAMED
AUTHOR GENERATED BY OPEN BABEL 2.3.90
ATOM 1 N PHE A 1 -28.497 -21.375 1.835 1.00 0.00 N
ATOM 2 CA PHE A 1 -27.282 -21.191 1.068 1.00 0.00 C
ATOM 3 C PHE A 1 -27.048 -22.391 0.162 1.00 0.00 C
ATOM 4 O PHE A 1 -26.148 -23.191 0.408 1.00 0.00 O
ATOM 5 CB PHE A 1 -26.071 -21.047 1.977 1.00 0.00 C
ATOM 6 CG PHE A 1 -26.119 -19.866 2.917 1.00 0.00 C
ATOM 7 CD2 PHE A 1 -26.393 -20.064 4.275 1.00 0.00 C
ATOM 8 CD1 PHE A 1 -25.887 -18.575 2.430 1.00 0.00 C
ATOM 9 CE1 PHE A 1 -25.932 -17.479 3.301 1.00 0.00 C
ATOM 10 CZ PHE A 1 -26.206 -17.677 4.660 1.00 0.00 C
ATOM 11 CE2 PHE A 1 -26.438 -18.969 5.147 1.00 0.00 C
ATOM 12 N PHE A 2 -27.862 -22.514 -0.889 1.00 0.00 N
ATOM 13 CA PHE A 2 -27.742 -23.613 -1.826 1.00 0.00 C
ATOM 14 C PHE A 2 -26.824 -23.222 -2.975 1.00 0.00 C
Комментарии:
1. Акшай Хегде Спасибо, я приближаюсь к желаемому результату. И последнее, возможно ли, чтобы все остальные столбцы сохраняли начальные пробелы (/ позиции) после замены столбцов новыми данными.
2. @SamuelKyobe если вы заметили, что он сильно сдвинут из-за того, что 3-й столбец имеет более 1 символа, он фактически сохранил свой интервал, вы можете проверить, установив
$3="TEST";
или, возможно, что-то подобное, что вы можете попробовать, если знаете ширину$3=sprintf("%-3s",t[1]);