用另一个文件中的列替换一个文件中的列?

时间:2016-03-24 14:10:05

标签: awk text-processing

我的文件1如下,

ATOM     48  O   ILE A   6       7.686  11.253  -7.457  1.00 27.81           O
ATOM     49  CB  ILE A   6       6.898  13.596  -9.634  1.00 26.66           C
ATOM     50  CG1 ILE A   6       8.370  13.338  -9.831  1.00 24.73           C
ATOM     51  CG2 ILE A   6       6.637  15.204  -9.788  1.00 26.32           C
ATOM     52  CD1 ILE A   6       8.976  13.780 -11.270  1.00 32.46           C

现在,我想用file2中的另一列替换$ 11列,以获得如下输出,

ATOM     48  O   ILE A   6       7.686  11.253  -7.457  1.00 -28.81          O
ATOM     49  CB  ILE A   6       6.898  13.596  -9.634  1.00  30.66          C
ATOM     50  CG1 ILE A   6       8.370  13.338  -9.831  1.00 -56.73          C
ATOM     51  CG2 ILE A   6       6.637  15.204  -9.788  1.00  46.32          C
ATOM     52  CD1 ILE A   6       8.976  13.780 -11.270  1.00  4.46           C

file2如下,

-28.81 
30.66
-56.73
46.32
4.46

我试图写这个代码工作正常但格式化已经改变。

for i in {1..798}
do 
paste -d, <(awk -F' ' 'NR == '$i' {print $1 "  " $2 "   " $3 "     " $4 "     " $5 "     " $6 "    " $7 "    " $8 "    " $9 "    " $10 }' 1IV7_bfac_try.pdb) <(awk -F' ' ' NR == '$i' {print $0}' colm_awk) <(awk -F' ' 'NR == '$i' {print $12}' 1IV7_bfac_try.pdb) >> new
done

任何有关awk或其他内容的帮助都会有用,谢谢。

2 个答案:

答案 0 :(得分:1)

awk救援!

awk 'NR==FNR{c11[NR]=$1; next} {$11=c11[FNR]}1' file2 file1

答案 1 :(得分:1)

如上所述here

<强>输入

::::::::::::::
f1
::::::::::::::
ATOM     48  O   ILE A   6       7.686  11.253  -7.457  1.00 27.81           O
ATOM     49  CB  ILE A   6       6.898  13.596  -9.634  1.00 26.66           C
ATOM     50  CG1 ILE A   6       8.370  13.338  -9.831  1.00 24.73           C
ATOM     51  CG2 ILE A   6       6.637  15.204  -9.788  1.00 26.32           C
ATOM     52  CD1 ILE A   6       8.976  13.780 -11.270  1.00 32.46           C
::::::::::::::
f2
::::::::::::::
-28.81
30.66
-56.73
46.32
4.46

<强>输出

awk 'FNR==NR{a[NR]=$1;next}{$11=a[FNR]}1' f2 f1

ATOM 48 O ILE A 6 7.686 11.253 -7.457 1.00 -28.81 O
ATOM 49 CB ILE A 6 6.898 13.596 -9.634 1.00 30.66 C
ATOM 50 CG1 ILE A 6 8.370 13.338 -9.831 1.00 -56.73 C
ATOM 51 CG2 ILE A 6 6.637 15.204 -9.788 1.00 46.32 C
ATOM 52 CD1 ILE A 6 8.976 13.780 -11.270 1.00 4.46 C

<强>解释

  • FNR==NR允许您一次处理一个完整的文件。在这种情况下,它是文件f2NRFNR都包含行号,当读取新文件时,FNR的差异将重置为1,NR继续递增。
  • 在我们使用f2文件时,我们正在创建一个名为a的数组,使用行号(NR)作为key和第一列({{1 }}作为值。 $1允许我们跳过动作块的其余部分。
  • next文件结束后,我们开始处理f2文件。 f1条件不会变为错误,因为NR==FNR将从1开始递增,而FNR则不会。因此,只有第11个动作块NR将被处理。
  • 这个块的作用是通过查找行号将第二列值重新分配给数组值。
  • 最后
  • {$11=a[FNR]}打印出该行。它返回true,并且在1真实语句中导致行的打印。
  • awk是定义文件的顺序。由于我们想要从文件f2 f1创建一个数组,我们先把它放在第一位。

关于格式化,另一个有趣的例子是here

f2