编辑后保持PDB文件格式。

时间:2017-07-17 13:02:28

标签: awk formatting pdb

我有xxx.pdb文件:

ATOM 1910 CB SER 128 45.806 50.621 39.840 1.50 9.36
ATOM 1913 OG SER 128 44.538 51.195 39.571 1.50 9.36
ATOM 1915 C SER 128 45.325 48.172 40.360 1.50 9.36
ATOM 1916 O SER 128 45.368 47.955 39.155 1.50 9.36
ATOM   1917  N   SER   129      44.953  47.236  41.238  1.00 11.24
ATOM   1919  CA  SER   129      44.395  45.938  40.826  1.00 11.24
ATOM   1921  CB  SER   129      44.091  45.053  42.031  1.00 11.24
ATOM   1924  OG  SER   129      43.483  45.786  43.085  1.00 11.24

当我尝试这段代码时:awk'{if($ 10< 11){$ 9 =“1.50”}; print $ 0}'xxx.pdb

发生了这种情况:

    const CustomTabView = ({ router, navigation }) => {
  const { routes, index } = navigation.state;

  const ActiveScreen = router.getComponentForState(navigation.state);

  const routeNav = addNavigationHelpers({
    ...navigation,
    state: routes[index],
  });
  const routeOptions = router.getScreenOptions(routeNav, 'tabBar');
  return (
    <View style={styles.container}>
      <CustomTabBar
        navigation={navigation}
        activeRouteName={routes[index].routeName}
        icon={routeOptions.tabBarIcon}
      />
      <ActiveScreen
        navigation={addNavigationHelpers({
          ...navigation,
          state: routes[index]
        })}
      />
    </View>
  );
}; 

有关如何保留列格式的任何想法吗?

感谢。

4 个答案:

答案 0 :(得分:0)

awk 'BEGIN{FS=OFS="\t";}{if($10<11){$9="1.50"};print $0}' xxx.pdb

使用tab作为输入和输出分隔符。

答案 1 :(得分:0)

如果perl没问题

$ perl -ape 's/\S+(?=\s+\S+$)/1.50/ if $F[-1]<11' xxx.pdb 
 ATOM   1910  CB  SER   128      45.806  50.621  39.840  1.50  9.36
 ATOM   1913  OG  SER   128      44.538  51.195  39.571  1.50  9.36
 ATOM   1915  C   SER   128      45.325  48.172  40.360  1.50  9.36
 ATOM   1916  O   SER   128      45.368  47.955  39.155  1.50  9.36
 ATOM   1917  N   SER   129      44.953  47.236  41.238  1.00 11.24
 ATOM   1919  CA  SER   129      44.395  45.938  40.826  1.00 11.24
 ATOM   1921  CB  SER   129      44.091  45.053  42.031  1.00 11.24
 ATOM   1924  OG  SER   129      43.483  45.786  43.085  1.00 11.24
  • \S+(?=\s+\S+$)使用正向前瞻来匹配最后一个字段
    • 如果行尾可以有空格
    • ,请使用\S+(?=\s+\S+\s*$)
  • $F[-1]<11条件检查最后一个字段是否小于11
  • 有关-ape选项的详细信息,请参阅http://perldoc.perl.org/perlrun.html#Command-Switches-a选项会自动拆分空格上的输入行并保存到@F数组

答案 2 :(得分:0)

使用GNU awk for gensub():

$ awk '$NF<11{$0=gensub(/\S+(\s+\S+)$/,"1.50\\1",1)}1' file
 ATOM   1910  CB  SER   128      45.806  50.621  39.840  1.50  9.36
 ATOM   1913  OG  SER   128      44.538  51.195  39.571  1.50  9.36
 ATOM   1915  C   SER   128      45.325  48.172  40.360  1.50  9.36
 ATOM   1916  O   SER   128      45.368  47.955  39.155  1.50  9.36
 ATOM   1917  N   SER   129      44.953  47.236  41.238  1.00 11.24
 ATOM   1919  CA  SER   129      44.395  45.938  40.826  1.00 11.24
 ATOM   1921  CB  SER   129      44.091  45.053  42.031  1.00 11.24
 ATOM   1924  OG  SER   129      43.483  45.786  43.085  1.00 11.24

无论字段之间的空白区域(标签,空白,等等......),上述内容都会有效。

答案 3 :(得分:0)

我不确定您要完成什么,但是总的来说,要读取xxx.pdb文件,然后输出正确格式的new.pdb文件,这就是我要做的:

    awk '{printf "%4s%7.0f%3s%6s%2s%4.0f%12.3f%8.3f%8.3f%6.2f%7.2f\n", $1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11}' < xxx.pdb >> new.pdb

(此代码除了进行复制外实际上不会做任何事情)

如果我想使用变量来更改一个字段(如第二个字段),它看起来像:

    VARIABLE=3

    awk -v x=$VARIABLE '{printf "%4s%7.0f%3s%6s%2s%4.0f%12.3f%8.3f%8.3f%6.2f%7.2f\n", $1, ($2 + x), $3, $4, $5, $6, $7, $8, $9, $10, $11}' < xxx.pdb >> new.pdb

这会将pdb文件的第二列全部加3。