【问题标题】:column manipulation with different files使用不同文件进行列操作
【发布时间】:2018-02-07 04:18:13
【问题描述】:

我有一个非常烦人的问题:我正在使用 2 个文件,我需要替换原始文件的列,同时保持其格式不变。这是格式:

HETATM 1 CA LIG 1 38.925 -1.038 -22.754 1.00 0.00 Ca
HETATM 2 CA LIG 1 38.509 -0.159 -22.703 1.00 0.00 Ca
HETATM 3 CA LIG 1 37.873 -0.673 -22.309 1.00 0.00 Ca
HETATM 4 CA LIG 1 37.261 -1.434 -22.569 1.00 0.00 Ca
HETATM 5 CA LIG 1 37.800 -2.277 -22.363 1.00 0.00 Ca
HETATM 6 CA LIG 1 37.764 -1.612 -21.664 1.00 0.00 Ca
HETATM 7 CA LIG 1 36.833 -1.557 -21.515 1.00 0.00 Ca
HETATM 8 CA LIG 1 35.941 -1.643 -21.936 1.00 0.00 Ca
HETATM 9 CA LIG 1 35.959 -2.319 -22.634 1.00 0.00 Ca
HETATM 10 CA LIG 1 36.670 -2.501 -21.971 1.00 0.00 Ca

这是它应该的样子,但是,在任何操作后,这种格式都会丢失。

所以,现在我有一个 .xyz 格式的不同文件,我需要用 .xyz 文件中的 $6 列替换上述文件中的第 9 列 (1.00)。

10
CA 38.6675 -1.72133 -22.1513 6.90816 3.5 CA 38.925 -1.03771 -22.7538 6.87802 4 CA 38.5086 -0.158653 -22.7027 6.12023 3.5 CA 37.8732 -0.67308 -22.309 5.93085 3.75 CA 37.2605 -1.43401 -22.569 6.07069 3.25 CA 37.8002 -2.27692 -22.3632 6.39441 2.25 CA 37.7642 -1.61234 -21.6638 5.44254 3 CA 36.8325 -1.55711 -21.5145 5.45608 3.75 CA 35.9408 -1.64281 -21.936 5.20951 4 CA 35.9593 -2.31915 -22.6336 5.91997 4.5

我使用以下命令: awk 'NR==FNR{c11[NR]=$6; next} {$9=c11[FNR]}1' data.xyz data.pdb > out.pdb

我确实得到了我在技术上需要的东西,但该文件未被识别为 .pdb,并且间距丢失:

这非常令人困惑,我不知道如何继续。非常感谢我们提前提供的帮助!

【问题讨论】:

  • 阅读awk tutorial 并阅读有关FSOFS(Field Sep 和 Output Field Sep)的信息。祝你好运。
  • 请在输出中使用代码标签,不要向我们展示图片,以便我们更好地理解您的问题并尽力帮助您。
  • 谢谢,我都做了,因为我发现很难解释格式有何不同,代码标签不一定显示它,因此图片...
  • 我对@9​​87654330@ 文件不熟悉,但如果您需要对齐某些列,我建议使用column 命令!

标签: awk formatting


【解决方案1】:

答案特别适合您的文件

我认为 printf 会更适合打印你的行:

阅读 awk的printf手册

我已将 awk 的 1 更改为 awk 的 printf 格式:

 awk 'NR==FNR{c11[NR]=$6; next} {$9=c11[FNR]} {printf "%s %2s %s %s %s %s %s %s %4s %s %s\n", $1,$2,$3,$4,$5,$6,$7,$8,$9,$10,$11}' file2 file1

【讨论】:

    【解决方案2】:

    您的问题非常模糊(输入/输出格式错误,输出与输入不匹配,没有预期的输出,没有说明您是否希望保留空格或填充新值以保持对齐,没有指示空格是否是空白或制表符或两者兼而有之等),但也许这就是您想要的,使用 GNU awk 进行 gensub():

    $ cat file1
    a      b         c     d
    
    $ cat file2
    X Y
    
    $ awk 'NR==FNR{a[NR]=$2;next} {$0=gensub(/((\S+\s+){1})\S+/,"\\1"a[FNR],1)} 1' file2 file1
    a      Y         c     d
    
    $ awk 'NR==FNR{a[NR]=$2;next} {$0=gensub(/((\S+\s+){2})\S+/,"\\1"a[FNR],1)} 1' file2 file1
    a      b         Y     d
    
    $ awk 'NR==FNR{a[NR]=$2;next} {$0=gensub(/((\S+\s+){3})\S+/,"\\1"a[FNR],1)} 1' file2 file1
    a      b         c     Y
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-06-04
      • 1970-01-01
      • 1970-01-01
      • 2018-08-03
      • 2011-07-16
      • 2018-07-31
      • 1970-01-01
      • 2022-01-12
      相关资源
      最近更新 更多