使用awk更改特定步骤中特定列中每个字段的值?
Change values of each field in a specific column in specific step by using awk?
这是来自我的一个输入文件的非常小的片段(我有 100 个文件)。
900 mgdg molecules in water t= 600000.00000 step= 400000000
119898
1MGD C5 1 2.709 14.491 1.493
1MGD H5 2 2.664 14.412 1.433
1MGD O5 3 2.717 14.464 1.627
1MGD C1 4 2.599 14.430 1.687
1MGD H1 5 2.546 14.350 1.634
1MGD C2 6 2.504 14.550 1.687
1MGD H2 7 2.527 14.628 1.759
1MGD O2 8 2.370 14.507 1.721
1MGD HO2 9 2.338 14.563 1.791
1MGD C3 10 2.492 14.611 1.546
1MGD H3 11 2.430 14.548 1.482
1MGD O3 12 2.425 14.739 1.527
1MGD HO3 13 2.337 14.713 1.551
1MGD C4 14 2.622 14.618 1.470
1MGD H4 15 2.598 14.620 1.364
1MGD O4 16 2.684 14.733 1.508
19SOL OW16143 5.027 21.387 5.795
19SOL HW116144 4.959 21.399 5.861
19SOL HW216145 5.071 21.472 5.790
21SOL OW16149 0.525 22.084 5.174
21SOL HW116150 0.615 22.054 5.168
21SOL HW216151 0.520 22.125 5.260
43SOL OW16215 0.547 18.610 5.603
43SOL HW116216 0.517 18.532 5.650
43SOL HW216217 0.632 18.585 5.567
6.36535 23.37625 12.09434
我想要这样的输出
900 mgdg molecules in water t= 600000.00000 step= 400000000
119898
1MGD C5 1 2.709 14.491 1.493
1MGD H5 2 2.664 14.412 1.433
1MGD O5 3 2.717 14.464 1.627
1MGD C1 4 2.599 14.430 1.687
2MGD H1 5 2.546 14.350 1.634
2MGD C2 6 2.504 14.550 1.687
2MGD H2 7 2.527 14.628 1.759
2MGD O2 8 2.370 14.507 1.721
3MGD HO2 9 2.338 14.563 1.791
3MGD C3 10 2.492 14.611 1.546
3MGD H3 11 2.430 14.548 1.482
3MGD O3 12 2.425 14.739 1.527
4MGD HO3 13 2.337 14.713 1.551
4MGD C4 14 2.622 14.618 1.470
4MGD H4 15 2.598 14.620 1.364
4MGD O4 16 2.684 14.733 1.508
19SOL OW16143 5.027 21.387 5.795
19SOL HW116144 4.959 21.399 5.861
19SOL HW216145 5.071 21.472 5.790
21SOL OW16149 0.525 22.084 5.174
21SOL HW116150 0.615 22.054 5.168
21SOL HW216151 0.520 22.125 5.260
43SOL OW16215 0.547 18.610 5.603
43SOL HW116216 0.517 18.532 5.650
43SOL HW216217 0.632 18.585 5.567
6.36535 23.37625 12.09434
所以我想更改第一列的值,但只能从第 3 行更改为第 18 行。所以在每一步(例如 4)中,MGD 之前的数字都会增加。我试着写这样的脚本,但没有成功
awk '
{
if (NR >= 3 && NR <= 18)
{
FNR==3
{
++count
value=count"MGD"
}
{
=value
}
1
FNR%129==0
++count
value=count"MGD"
{print [=12=]}
}
else
{
print [=12=]
}
}
' eq4_1.gro | tee eq5_1.gro
我能够通过这个脚本得到满足您需求的东西:
BEGIN{
stepSize = 4
}
{
if (NR >= 3 && NR <= 18)
{
if ((NR - 3) % 4 == 0)
{
++count
}
printf("%5dMGD %s %s %s %s %s\n", count, , , , , )
}
else
{
print
}
}
gawk v5.0.0,运行 和 awk -f script.awk test.txt
输出:
900 mgdg molecules in water t= 600000.00000 step= 400000000
119898
1MGD C5 1 2.709 14.491 1.493
1MGD H5 2 2.664 14.412 1.433
1MGD O5 3 2.717 14.464 1.627
1MGD C1 4 2.599 14.430 1.687
2MGD H1 5 2.546 14.350 1.634
2MGD C2 6 2.504 14.550 1.687
2MGD H2 7 2.527 14.628 1.759
2MGD O2 8 2.370 14.507 1.721
3MGD HO2 9 2.338 14.563 1.791
3MGD C3 10 2.492 14.611 1.546
3MGD H3 11 2.430 14.548 1.482
3MGD O3 12 2.425 14.739 1.527
4MGD HO3 13 2.337 14.713 1.551
4MGD C4 14 2.622 14.618 1.470
4MGD H4 15 2.598 14.620 1.364
4MGD O4 16 2.684 14.733 1.508
19SOL OW16143 5.027 21.387 5.795
19SOL HW116144 4.959 21.399 5.861
19SOL HW216145 5.071 21.472 5.790
21SOL OW16149 0.525 22.084 5.174
21SOL HW116150 0.615 22.054 5.168
21SOL HW216151 0.520 22.125 5.260
43SOL OW16215 0.547 18.610 5.603
43SOL HW116216 0.517 18.532 5.650
43SOL HW216217 0.632 18.585 5.567
6.36535 23.37625 12.09434
这是来自我的一个输入文件的非常小的片段(我有 100 个文件)。
900 mgdg molecules in water t= 600000.00000 step= 400000000
119898
1MGD C5 1 2.709 14.491 1.493
1MGD H5 2 2.664 14.412 1.433
1MGD O5 3 2.717 14.464 1.627
1MGD C1 4 2.599 14.430 1.687
1MGD H1 5 2.546 14.350 1.634
1MGD C2 6 2.504 14.550 1.687
1MGD H2 7 2.527 14.628 1.759
1MGD O2 8 2.370 14.507 1.721
1MGD HO2 9 2.338 14.563 1.791
1MGD C3 10 2.492 14.611 1.546
1MGD H3 11 2.430 14.548 1.482
1MGD O3 12 2.425 14.739 1.527
1MGD HO3 13 2.337 14.713 1.551
1MGD C4 14 2.622 14.618 1.470
1MGD H4 15 2.598 14.620 1.364
1MGD O4 16 2.684 14.733 1.508
19SOL OW16143 5.027 21.387 5.795
19SOL HW116144 4.959 21.399 5.861
19SOL HW216145 5.071 21.472 5.790
21SOL OW16149 0.525 22.084 5.174
21SOL HW116150 0.615 22.054 5.168
21SOL HW216151 0.520 22.125 5.260
43SOL OW16215 0.547 18.610 5.603
43SOL HW116216 0.517 18.532 5.650
43SOL HW216217 0.632 18.585 5.567
6.36535 23.37625 12.09434
我想要这样的输出
900 mgdg molecules in water t= 600000.00000 step= 400000000
119898
1MGD C5 1 2.709 14.491 1.493
1MGD H5 2 2.664 14.412 1.433
1MGD O5 3 2.717 14.464 1.627
1MGD C1 4 2.599 14.430 1.687
2MGD H1 5 2.546 14.350 1.634
2MGD C2 6 2.504 14.550 1.687
2MGD H2 7 2.527 14.628 1.759
2MGD O2 8 2.370 14.507 1.721
3MGD HO2 9 2.338 14.563 1.791
3MGD C3 10 2.492 14.611 1.546
3MGD H3 11 2.430 14.548 1.482
3MGD O3 12 2.425 14.739 1.527
4MGD HO3 13 2.337 14.713 1.551
4MGD C4 14 2.622 14.618 1.470
4MGD H4 15 2.598 14.620 1.364
4MGD O4 16 2.684 14.733 1.508
19SOL OW16143 5.027 21.387 5.795
19SOL HW116144 4.959 21.399 5.861
19SOL HW216145 5.071 21.472 5.790
21SOL OW16149 0.525 22.084 5.174
21SOL HW116150 0.615 22.054 5.168
21SOL HW216151 0.520 22.125 5.260
43SOL OW16215 0.547 18.610 5.603
43SOL HW116216 0.517 18.532 5.650
43SOL HW216217 0.632 18.585 5.567
6.36535 23.37625 12.09434
所以我想更改第一列的值,但只能从第 3 行更改为第 18 行。所以在每一步(例如 4)中,MGD 之前的数字都会增加。我试着写这样的脚本,但没有成功
awk '
{
if (NR >= 3 && NR <= 18)
{
FNR==3
{
++count
value=count"MGD"
}
{
=value
}
1
FNR%129==0
++count
value=count"MGD"
{print [=12=]}
}
else
{
print [=12=]
}
}
' eq4_1.gro | tee eq5_1.gro
我能够通过这个脚本得到满足您需求的东西:
BEGIN{
stepSize = 4
}
{
if (NR >= 3 && NR <= 18)
{
if ((NR - 3) % 4 == 0)
{
++count
}
printf("%5dMGD %s %s %s %s %s\n", count, , , , , )
}
else
{
print
}
}
gawk v5.0.0,运行 和 awk -f script.awk test.txt
输出:
900 mgdg molecules in water t= 600000.00000 step= 400000000
119898
1MGD C5 1 2.709 14.491 1.493
1MGD H5 2 2.664 14.412 1.433
1MGD O5 3 2.717 14.464 1.627
1MGD C1 4 2.599 14.430 1.687
2MGD H1 5 2.546 14.350 1.634
2MGD C2 6 2.504 14.550 1.687
2MGD H2 7 2.527 14.628 1.759
2MGD O2 8 2.370 14.507 1.721
3MGD HO2 9 2.338 14.563 1.791
3MGD C3 10 2.492 14.611 1.546
3MGD H3 11 2.430 14.548 1.482
3MGD O3 12 2.425 14.739 1.527
4MGD HO3 13 2.337 14.713 1.551
4MGD C4 14 2.622 14.618 1.470
4MGD H4 15 2.598 14.620 1.364
4MGD O4 16 2.684 14.733 1.508
19SOL OW16143 5.027 21.387 5.795
19SOL HW116144 4.959 21.399 5.861
19SOL HW216145 5.071 21.472 5.790
21SOL OW16149 0.525 22.084 5.174
21SOL HW116150 0.615 22.054 5.168
21SOL HW216151 0.520 22.125 5.260
43SOL OW16215 0.547 18.610 5.603
43SOL HW116216 0.517 18.532 5.650
43SOL HW216217 0.632 18.585 5.567
6.36535 23.37625 12.09434