【问题标题】:Copying fields while maintaining whitespace在保留空格的同时复制字段
【发布时间】:2015-06-30 19:34:42
【问题描述】:

我有两个文件,一个 (calc_coord.txt),我需要将 x、y、z(字段 3、4、5)坐标复制到 original_coord.txt 中。我的问题是我无法保持正确的间距。我需要所有数字都从同一位置开始(即,负号应位于字段下方的每个数字的前面)。

(calc_coord.txt):

 C           6.0  -9.6300406713  -7.9721184039   0.1185895513
 C           6.0  -0.7745844593   0.1157508364  -6.4312181651
 O           8.0  -0.7886186832   8.3312194003   5.1214418928
 H           1.0  -8.5173944199  -1.0344814844   4.2057188615
 H           1.0  -1.3188019701  -1.9268396739  -3.3069629312
 H           1.0  -2.6875350807  -9.7931820111  -2.1222787934
 H           1.0  -0.9445605850   1.2508093202   1.0754040709
 O           8.0   7.0683517839  -0.7860544158   0.0997975722
 H           1.0  -0.5981284452   3.1733024008  -9.5005808667
 C           6.0   2.0350058476   0.2023241539  -9.0066961578
 H           1.0   2.9345243074  -4.1229157611   9.5464726503
 H           1.0   6.3575306659   0.4164272327  -9.0466036794
 H           1.0   1.7357929841   5.1723014064   9.4397462018

我想将坐标复制到的文件(original_coord.txt):

@<TRIPOS>ATOM 1 C -1.6300406713 -0.9721184039 0.1185895513 C.3 1 LIG1 0.0000 ***** 2 C -0.7745844593 0.1157508364 -0.4312181651 C.3 1 LIG1 0.0000 ***** 3 O -0.7886186832 1.3312194003 0.1214418928 O.3 1 LIG1 0.0000 ***** 4 H -1.5173944199 -1.0344814844 1.2057188615 H 1 LIG1 0.0000 ***** 5 H -1.3188019701 -1.9268396739 -0.3069629312 H 1 LIG1 0.0000 ***** 6 H -2.6875350807 -0.7931820111 -0.1222787934 H 1 LIG1 0.0000 ***** 7 H -0.9445605850 1.2508093202 1.0754040709 H 1 LIG1 0.0000 ***** 8 O 1.0683517839 -0.7860544158 0.0997975722 O.3 1 LIG1 0.0000 ***** 9 H -0.5981284452 0.1733024008 -1.5005808667 H 1 LIG1 0.0000 ***** 10 C 2.0350058476 0.2023241539 -0.0066961578 C.3 1 LIG1 0.0000 ***** 11 H 2.9345243074 -0.1229157611 0.5464726503 H 1 LIG1 0.0000 ***** 12 H 2.3575306659 0.4164272327 -1.0466036794 H 1 LIG1 0.0000 ***** 13 H 1.7357929841 1.1723014064 0.4397462018 H 1 LIG1 0.0000 *****

当我尝试使用 awk 时,我得到的坐标格式为:

@<TRIPOS>ATOM
    1 C   -9.6300406713  -7.9721184039  0.1185895513       C.3       1  LIG1 0.0000 *****
    2 C   -0.7745844593  0.1157508364   -6.4312181651      C.3       1  LIG1 0.0000 *****
    3 O   -0.7886186832  8.3312194003   5.1214418928       O.3       1  LIG1 0.0000 *****
    4 H   -8.5173944199  -1.0344814844  4.2057188615       H         1  LIG1 0.0000 *****
    5 H   -1.3188019701  -1.9268396739  -3.3069629312      H         1  LIG1 0.0000 *****
    6 H   -2.6875350807  -9.7931820111  -2.1222787934      H         1  LIG1 0.0000 *****
    7 H   -0.9445605850  1.2508093202   1.0754040709       H         1  LIG1 0.0000 *****
    8 O   7.0683517839   -0.7860544158  0.0997975722       O.3       1  LIG1 0.0000 *****
    9 H   -0.5981284452  3.1733024008   -9.5005808667      H         1  LIG1 0.0000 *****
   10 C   2.0350058476   0.2023241539   -9.0066961578      C.3       1  LIG1 0.0000 *****
   11 H   2.9345243074   -4.1229157611  9.5464726503       H         1  LIG1 0.0000 *****
   12 H   6.3575306659   0.4164272327   -9.0466036794      H         1  LIG1 0.0000 *****
   13 H   1.7357929841   5.1723014064   9.4397462018       H         1  LIG1 0.0000 *****

正如您所见,当我尝试覆盖字段时,格式有点混乱。无论是否有“-”,它都会打印从同一位置开始的所有字段。有什么建议吗?我一直在使用它来复制三个字段。谢谢!

awk '
    NR==FNR {v[FNR]=$3; next}
    {print substr($0,1,10) sprintf("%-14s", v[FNR]) substr($0,25)}
' calc_coord.txt original_coord.txt >updated_coord.txt

【问题讨论】:

  • 能否请您详细说明,很难看出您在问什么。你到底在复制什么?哪个间距是不希望的?因为似乎第二个文件的间距搞砸了,这是您问题的输入文件。这些文件中的哪个是calc_coord.txt´, which is original_coord.txt`,哪个是“updated_coord.txt”?
  • 抱歉,我试图更新我的问题以使其更清楚。
  • 我只需要将 original_coord.txt 中的 3,4,5 字段替换为 calc_coord.txt 中的 3,4,5 字段即可。问题是格式。我想在 original_coord.txt 中保持准确的格式

标签: bash awk whitespace


【解决方案1】:

我什至不能让你的文件在没有换行的情况下复制/粘贴等,所以未经测试的尝试:

awk '
NR==FNR { saved[NR]=substr($0,10,20); next }
{ print substr($0,1,5) saved[FNR] substr($0,26) }
' calc_coord.txt original_coord.txt

将 substr() arg 数字更改为您要查找的任何值。

【讨论】:

  • 这正是我想要的...我对 bash 很陌生,感谢您的帮助。
  • 不客气。获取 Chris Johnson 的《Shell Scripting Recipes》和 Arnold Robbins 的《Effective Awk Programming, 4th Edition》。
  • 太好了,我今天会研究这两个 :)
猜你喜欢
  • 2011-08-16
  • 1970-01-01
  • 1970-01-01
  • 2019-12-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-04-18
  • 1970-01-01
相关资源
最近更新 更多