在保持空格的同时复制字段

时间:2015-06-30 19:34:43

标签: bash awk whitespace

我有两个文件,一个(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

1 个答案:

答案 0 :(得分: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数字更改为您要查找的内容。