【问题标题】:Replace values in a specific column while maintaining the orginal format intact替换特定列中的值,同时保持原始格式不变
【发布时间】:2015-11-04 15:27:31
【问题描述】:

我的输入文件有以下格式,

 ATOM      1 Cal  Cal     1      61.270  93.780 100.040  1.00  0.00
 ATOM      2 Cal  Cal     2      12.080  65.560 105.560  1.00  0.00
 ATOM     13 Cal  Cal    13      40.800  13.530  75.100  1.00  0.00
 ATOM    200 Cal  Cal   200     102.620  22.520  97.600  1.00  0.00

我想用值 '32.450' 替换 8th-cloumn 中的所有值,同时保持原始格式(间距)不变。即,预期的输出应该如下所示,

 ATOM      1 Cal  Cal     1      61.270  93.780  32.450  1.00  0.00
 ATOM      2 Cal  Cal     2      12.080  65.560  32.450  1.00  0.00
 ATOM     13 Cal  Cal    13      40.800  13.530  32.450  1.00  0.00
 ATOM    200 Cal  Cal   200     102.620  22.520  32.450  1.00  0.00

我尝试过简单的 awk 命令

awk -F " " '{ 
   print $1" " $2" "$3" "$4" "$5" "$6" "$7" "'32.450'" "$9" "$10" 
}' input.pdb > output.pdb

但是,它未能保留原始格式。

谁能帮我找到一个更好的方法来做到这一点,最好是使用 awk 或 gawk?

【问题讨论】:

  • 您的预期输出确实更改了输入中的空格。例如。在输入中,第一行:93.780 100.040 两个字段之间有一个空格,但在输出中,你有两个空格:93.780 32.450 请解释对齐规则。
  • 文件为 pdb 格式。在这里,不是计算每列之间的空格,而是为每列中的值分配一组特定的空间

标签: awk gawk


【解决方案1】:

GNU awk:

gawk '
    BEGIN {FIELDWIDTHS="5 7 4 5 6 12 8 8 6 6"; OFS=""}
    {$8="  32.450"; print}
' file

输入

 ATOM      1 Cal  Cal     1      61.270  93.780 100.040  1.00  0.00
 ATOM      2 Cal  Cal     2      12.080  65.560 105.560  1.00  0.00
 ATOM     13 Cal  Cal    13      40.800  13.530  75.100  1.00  0.00
 ATOM    200 Cal  Cal   200     102.620  22.520  97.600  1.00  0.00

输出

 ATOM      1 Cal  Cal     1      61.270  93.780  32.450  1.00  0.00
 ATOM      2 Cal  Cal     2      12.080  65.560  32.450  1.00  0.00
 ATOM     13 Cal  Cal    13      40.800  13.530  32.450  1.00  0.00
 ATOM    200 Cal  Cal   200     102.620  22.520  32.450  1.00  0.00

【讨论】:

  • FIELDWIDTHS的美妙用法!
  • 要强制使用字段宽度,这可能会更好:$8 = sprintf "%8.3f", 32.45
【解决方案2】:

如果您在示例输入中一直有固定宽度的列:

$ awk '{ print substr($0,1,47) " 32.450" substr($0,55) }' f.txt
ATOM      1 Cal  Cal     1      61.270  93.780  32.450  1.00  0.00
ATOM      2 Cal  Cal     2      12.080  65.560  32.450  1.00  0.00
ATOM     13 Cal  Cal    13      40.800  13.530  32.450  1.00  0.00
ATOM    200 Cal  Cal   200     102.620  22.520  32.450  1.00  0.00

【讨论】:

    【解决方案3】:

    只需告诉sed 捕捉前 7 个块,跳过第 8 个并打印第 7 个后面跟着32.450

    $  sed -r 's/(( +[^ ]+){7}) +[^ ]+/\1  32.450/' file
    ATOM      1 Cal  Cal     1      61.270  93.780  32.450  1.00  0.00
    ATOM      2 Cal  Cal     2      12.080  65.560  32.450  1.00  0.00
    ATOM     13 Cal  Cal    13      40.800  13.530  32.450  1.00  0.00
    ATOM    200 Cal  Cal   200     102.620  22.520  32.450  1.00  0.00
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-16
      • 2018-06-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-24
      相关资源
      最近更新 更多