在awk中的列之间正确保持space(每个字段的宽度)?
Keep properly space between column in awk (width of each field)?
我有一个大问题。我正在处理 .gro 文件,它看起来像这样:
1BGL C5 1 2.636 14.120 1.951 -0.0345 -0.8088 -0.2809
1BGL H5 2 2.573 14.031 1.945 0.1969 -1.0999 1.1792
1BGL O5 3 2.567 14.198 1.847 -1.0918 -0.2789 -0.0370
1BGL C1 4 2.644 14.307 1.793 -0.3029 -0.4378 -0.4234
1BGL H1 5 2.600 14.360 1.709 1.4710 0.2783 -0.9469
1BGL C2 6 2.794 14.277 1.750 0.2264 0.3957 0.6673
1BGL H2 7 2.855 14.363 1.723 0.7219 0.1907 1.1240
1BGL O2 8 2.787 14.184 1.640 -0.1728 -0.5002 -0.0302
1BGL HO2 9 2.788 14.247 1.569 1.3442 -0.4575 0.0054
1BGL C3 10 2.868 14.205 1.867 0.4088 0.4514 0.0495
1BGL H3 11 2.962 14.157 1.840 0.0154 -2.1311 2.8580
1BGL O3 12 2.901 14.298 1.973 0.0978 0.1123 -0.2596
1BGL HO3 13 2.942 14.246 2.040 -1.2865 3.4404 3.5009
1BGL C4 14 2.783 14.089 1.918 0.6092 0.5852 -0.0412
1BGL H4 15 2.786 14.021 1.832 0.7162 -0.0675 0.4699
1BGL O4 16 2.854 14.040 2.031 0.3832 -0.0763 -0.6561
当我使用awk时,它看起来像
1BGL C5 1 2.636 14.120 1.951 -0.0345 -0.8088 -0.2809
1BGL H5 2 2.573 14.031 1.945 0.1969 -1.0999 1.1792
1BGL O5 3 2.567 14.198 1.847 -1.0918 -0.2789 -0.0370
1BGL C1 4 2.644 14.307 1.793 -0.3029 -0.4378 -0.4234
1BGL H1 5 2.600 14.360 1.709 1.4710 0.2783 -0.9469
1BGL C2 6 2.794 14.277 1.750 0.2264 0.3957 0.6673
1BGL H2 7 2.855 14.363 1.723 0.7219 0.1907 1.1240
1BGL O2 8 2.787 14.184 1.640 -0.1728 -0.5002 -0.0302
1BGL HO2 9 2.788 14.247 1.569 1.3442 -0.4575 0.0054
1BGL C3 10 2.868 14.205 1.867 0.4088 0.4514 0.0495
1BGL H3 11 2.962 14.157 1.840 0.0154 -2.1311 2.8580
1BGL O3 12 2.901 14.298 1.973 0.0978 0.1123 -0.2596
1BGL HO3 13 2.942 14.246 2.040 -1.2865 3.4404 3.5009
1BGL C4 14 2.783 14.089 1.918 0.6092 0.5852 -0.0412
1BGL H4 15 2.786 14.021 1.832 0.7162 -0.0675 0.4699
1BGL O4 16 2.854 14.040 2.031 0.3832 -0.0763 -0.6561
你可以在这里阅读
http://manual.gromacs.org/archive/5.0.4/online/gro.html
这种格式是固定的,即。所有列都处于固定位置。可选地(目前仅使用 trjconv)您可以编写具有任意小数位数的 gro 文件,格式将是 n+5 个位置和 n 个小数位(n+1 表示速度)而不是 8 和 3(有 4速度)。读取时,将从小数点之间的距离(将为 n+5)推断出精度。列包含以下信息(从左到右):
residue number (5 positions, integer)
residue name (5 characters)
atom name (5 characters)
atom number (5 positions, integer)
position (in nm, x y z in 3 columns, each 8 positions with 3 decimal places)
velocity (in nm/ps (or km/s), x y z in 3 columns, each 8 positions with 4 decimal places)
请注意,单独的分子或离子(例如水或 Cl-)被视为残基。如果你想在你自己的程序中编写这样一个文件而不使用 GROMACS 库,你可以使用以下格式:
C格式
"%5d%-5s%5s%5d%8.3f%8.3f%8.3f%8.4f%8.4f%8.4f"
所以我想在使用 awk 后在列之间适当地保持 space。是否有可能像在 C 中那样使用 printf("%8i %6 i", column1, column2)?
例如我使用那个脚本
#!/bin/bash
awk '
FNR==1{
++count
value=count"BGL"
}
{
=value
}
1
FNR%3==0{
++count
value=count"BGL"
}
' after_SOL.gro | tee after_SOL2.gro
我输入的片段
1BGL C5 1 2.636 14.120 1.951 -0.0345 -0.8088 -0.2809
1BGL H5 2 2.573 14.031 1.945 0.1969 -1.0999 1.1792
1BGL O5 3 2.567 14.198 1.847 -1.0918 -0.2789 -0.0370
1BGL C5 130 6.603 15.918 1.894 -0.6780 0.4970 -0.5245
1BGL H5 131 6.632 15.913 1.999 0.6027 -3.0418 -0.9360
1BGL O5 132 6.497 16.023 1.909 -1.1935 0.9474 -0.2080
1BGL C5 259 5.066 8.182 0.249 -0.2465 -0.7831 -0.0006
1BGL H5 260 5.085 8.166 0.355 2.0262 -0.0662 -0.2570
1BGL O5 261 5.080 8.322 0.226 -0.6550 -0.0725 -0.0582
我的输出
1BGL C5 1 2.636 14.120 1.951 -0.0345 -0.8088 -0.2809
1BGL H5 2 2.573 14.031 1.945 0.1969 -1.0999 1.1792
1BGL O5 3 2.567 14.198 1.847 -1.0918 -0.2789 -0.0370
2BGL C5 130 6.603 15.918 1.894 -0.6780 0.4970 -0.5245
2BGL H5 131 6.632 15.913 1.999 0.6027 -3.0418 -0.9360
2BGL O5 132 6.497 16.023 1.909 -1.1935 0.9474 -0.2080
3BGL C5 259 5.066 8.182 0.249 -0.2465 -0.7831 -0.0006
3BGL H5 260 5.085 8.166 0.355 2.0262 -0.0662 -0.2570
3BGL O5 261 5.080 8.322 0.226 -0.6550 -0.0725 -0.0582
不,不可能在 GROMACS 程序中使用该文件,因为它需要在列
之间正确 space
您发布的脚本不会产生您发布的输出,但如果产生了,您可以将其更改为:
$ cat tst.awk
FNR==1{
++count
value=count"BGL"
}
{
match([=10=],/^[[:space:]]*[^[:space:]]+/)
[=10=] = sprintf("%*s%s",RLENGTH,value,substr([=10=],RLENGTH+1))
}
1
FNR%22==0{
++count
value=count"BGL"
}
这是我真正编写您正在使用的脚本的方式,虽然它可以获取您发布的输出,因此您不会编写重复代码来递增 count
并设置 value
而您不需要无论如何都不需要 count
或 value
变量:
$ cat tst.awk
{
match([=11=],/^[[:space:]]*[0-9]+/)
printf "%*d%s\n", RLENGTH, int(((NR-1)/3)+1), substr([=11=],RLENGTH+1)
}
$ awk -f tst.awk file
1BGL C5 1 2.636 14.120 1.951 -0.0345 -0.8088 -0.2809
1BGL H5 2 2.573 14.031 1.945 0.1969 -1.0999 1.1792
1BGL O5 3 2.567 14.198 1.847 -1.0918 -0.2789 -0.0370
2BGL C5 130 6.603 15.918 1.894 -0.6780 0.4970 -0.5245
2BGL H5 131 6.632 15.913 1.999 0.6027 -3.0418 -0.9360
2BGL O5 132 6.497 16.023 1.909 -1.1935 0.9474 -0.2080
3BGL C5 259 5.066 8.182 0.249 -0.2465 -0.7831 -0.0006
3BGL H5 260 5.085 8.166 0.355 2.0262 -0.0662 -0.2570
3BGL O5 261 5.080 8.322 0.226 -0.6550 -0.0725 -0.0582
我有一个大问题。我正在处理 .gro 文件,它看起来像这样:
1BGL C5 1 2.636 14.120 1.951 -0.0345 -0.8088 -0.2809
1BGL H5 2 2.573 14.031 1.945 0.1969 -1.0999 1.1792
1BGL O5 3 2.567 14.198 1.847 -1.0918 -0.2789 -0.0370
1BGL C1 4 2.644 14.307 1.793 -0.3029 -0.4378 -0.4234
1BGL H1 5 2.600 14.360 1.709 1.4710 0.2783 -0.9469
1BGL C2 6 2.794 14.277 1.750 0.2264 0.3957 0.6673
1BGL H2 7 2.855 14.363 1.723 0.7219 0.1907 1.1240
1BGL O2 8 2.787 14.184 1.640 -0.1728 -0.5002 -0.0302
1BGL HO2 9 2.788 14.247 1.569 1.3442 -0.4575 0.0054
1BGL C3 10 2.868 14.205 1.867 0.4088 0.4514 0.0495
1BGL H3 11 2.962 14.157 1.840 0.0154 -2.1311 2.8580
1BGL O3 12 2.901 14.298 1.973 0.0978 0.1123 -0.2596
1BGL HO3 13 2.942 14.246 2.040 -1.2865 3.4404 3.5009
1BGL C4 14 2.783 14.089 1.918 0.6092 0.5852 -0.0412
1BGL H4 15 2.786 14.021 1.832 0.7162 -0.0675 0.4699
1BGL O4 16 2.854 14.040 2.031 0.3832 -0.0763 -0.6561
当我使用awk时,它看起来像
1BGL C5 1 2.636 14.120 1.951 -0.0345 -0.8088 -0.2809
1BGL H5 2 2.573 14.031 1.945 0.1969 -1.0999 1.1792
1BGL O5 3 2.567 14.198 1.847 -1.0918 -0.2789 -0.0370
1BGL C1 4 2.644 14.307 1.793 -0.3029 -0.4378 -0.4234
1BGL H1 5 2.600 14.360 1.709 1.4710 0.2783 -0.9469
1BGL C2 6 2.794 14.277 1.750 0.2264 0.3957 0.6673
1BGL H2 7 2.855 14.363 1.723 0.7219 0.1907 1.1240
1BGL O2 8 2.787 14.184 1.640 -0.1728 -0.5002 -0.0302
1BGL HO2 9 2.788 14.247 1.569 1.3442 -0.4575 0.0054
1BGL C3 10 2.868 14.205 1.867 0.4088 0.4514 0.0495
1BGL H3 11 2.962 14.157 1.840 0.0154 -2.1311 2.8580
1BGL O3 12 2.901 14.298 1.973 0.0978 0.1123 -0.2596
1BGL HO3 13 2.942 14.246 2.040 -1.2865 3.4404 3.5009
1BGL C4 14 2.783 14.089 1.918 0.6092 0.5852 -0.0412
1BGL H4 15 2.786 14.021 1.832 0.7162 -0.0675 0.4699
1BGL O4 16 2.854 14.040 2.031 0.3832 -0.0763 -0.6561
你可以在这里阅读 http://manual.gromacs.org/archive/5.0.4/online/gro.html
这种格式是固定的,即。所有列都处于固定位置。可选地(目前仅使用 trjconv)您可以编写具有任意小数位数的 gro 文件,格式将是 n+5 个位置和 n 个小数位(n+1 表示速度)而不是 8 和 3(有 4速度)。读取时,将从小数点之间的距离(将为 n+5)推断出精度。列包含以下信息(从左到右):
residue number (5 positions, integer)
residue name (5 characters)
atom name (5 characters)
atom number (5 positions, integer)
position (in nm, x y z in 3 columns, each 8 positions with 3 decimal places)
velocity (in nm/ps (or km/s), x y z in 3 columns, each 8 positions with 4 decimal places)
请注意,单独的分子或离子(例如水或 Cl-)被视为残基。如果你想在你自己的程序中编写这样一个文件而不使用 GROMACS 库,你可以使用以下格式:
C格式 "%5d%-5s%5s%5d%8.3f%8.3f%8.3f%8.4f%8.4f%8.4f"
所以我想在使用 awk 后在列之间适当地保持 space。是否有可能像在 C 中那样使用 printf("%8i %6 i", column1, column2)?
例如我使用那个脚本
#!/bin/bash
awk '
FNR==1{
++count
value=count"BGL"
}
{
=value
}
1
FNR%3==0{
++count
value=count"BGL"
}
' after_SOL.gro | tee after_SOL2.gro
我输入的片段
1BGL C5 1 2.636 14.120 1.951 -0.0345 -0.8088 -0.2809
1BGL H5 2 2.573 14.031 1.945 0.1969 -1.0999 1.1792
1BGL O5 3 2.567 14.198 1.847 -1.0918 -0.2789 -0.0370
1BGL C5 130 6.603 15.918 1.894 -0.6780 0.4970 -0.5245
1BGL H5 131 6.632 15.913 1.999 0.6027 -3.0418 -0.9360
1BGL O5 132 6.497 16.023 1.909 -1.1935 0.9474 -0.2080
1BGL C5 259 5.066 8.182 0.249 -0.2465 -0.7831 -0.0006
1BGL H5 260 5.085 8.166 0.355 2.0262 -0.0662 -0.2570
1BGL O5 261 5.080 8.322 0.226 -0.6550 -0.0725 -0.0582
我的输出
1BGL C5 1 2.636 14.120 1.951 -0.0345 -0.8088 -0.2809
1BGL H5 2 2.573 14.031 1.945 0.1969 -1.0999 1.1792
1BGL O5 3 2.567 14.198 1.847 -1.0918 -0.2789 -0.0370
2BGL C5 130 6.603 15.918 1.894 -0.6780 0.4970 -0.5245
2BGL H5 131 6.632 15.913 1.999 0.6027 -3.0418 -0.9360
2BGL O5 132 6.497 16.023 1.909 -1.1935 0.9474 -0.2080
3BGL C5 259 5.066 8.182 0.249 -0.2465 -0.7831 -0.0006
3BGL H5 260 5.085 8.166 0.355 2.0262 -0.0662 -0.2570
3BGL O5 261 5.080 8.322 0.226 -0.6550 -0.0725 -0.0582
不,不可能在 GROMACS 程序中使用该文件,因为它需要在列
之间正确 space您发布的脚本不会产生您发布的输出,但如果产生了,您可以将其更改为:
$ cat tst.awk
FNR==1{
++count
value=count"BGL"
}
{
match([=10=],/^[[:space:]]*[^[:space:]]+/)
[=10=] = sprintf("%*s%s",RLENGTH,value,substr([=10=],RLENGTH+1))
}
1
FNR%22==0{
++count
value=count"BGL"
}
这是我真正编写您正在使用的脚本的方式,虽然它可以获取您发布的输出,因此您不会编写重复代码来递增 count
并设置 value
而您不需要无论如何都不需要 count
或 value
变量:
$ cat tst.awk
{
match([=11=],/^[[:space:]]*[0-9]+/)
printf "%*d%s\n", RLENGTH, int(((NR-1)/3)+1), substr([=11=],RLENGTH+1)
}
$ awk -f tst.awk file
1BGL C5 1 2.636 14.120 1.951 -0.0345 -0.8088 -0.2809
1BGL H5 2 2.573 14.031 1.945 0.1969 -1.0999 1.1792
1BGL O5 3 2.567 14.198 1.847 -1.0918 -0.2789 -0.0370
2BGL C5 130 6.603 15.918 1.894 -0.6780 0.4970 -0.5245
2BGL H5 131 6.632 15.913 1.999 0.6027 -3.0418 -0.9360
2BGL O5 132 6.497 16.023 1.909 -1.1935 0.9474 -0.2080
3BGL C5 259 5.066 8.182 0.249 -0.2465 -0.7831 -0.0006
3BGL H5 260 5.085 8.166 0.355 2.0262 -0.0662 -0.2570
3BGL O5 261 5.080 8.322 0.226 -0.6550 -0.0725 -0.0582