使用 awk 根据先前记录的计数更新特定列中的字段
Update field in a specific column according to counts over previous records using awk
我必须更新下面输入文件的第一个字段(不包括前两行是header。第一列中BGL、GLC和LIN之前的数字是一个计数器,必须是以这样一种方式更新,即对于具有相同分子 BCL、GLC 和 LIN 的每一系列记录,计数器都会增加一个。
在我的输入文件的一小段下方(我有 100 个这样的文件):
900 mgdg molecules in water t= 600000.00000 step= 400000000
177255
1BGL C5 1 2.709 14.491 1.493
1BGL H5 2 2.664 14.412 1.433
1BGL O5 3 2.717 14.464 1.627
1BGL C1 4 2.599 14.430 1.687
1BGL H1 5 2.546 14.350 1.634
2GLC O1 23 2.609 14.403 1.823
2GLC C1 24 2.675 14.276 1.837
2GLC H11 25 2.607 14.204 1.790
3LIN C3 44 3.033 14.281 2.268
3LIN H31 45 3.136 14.298 2.235
4LIN C3 87 3.108 13.927 2.066
4LIN H31 88 3.077 13.879 2.159
1BGL C5 1 2.709 14.491 1.493
1BGL H5 2 2.664 14.412 1.433
1BGL O5 3 2.717 14.464 1.627
1BGL C1 4 2.599 14.430 1.687
1BGL H1 5 2.546 14.350 1.634
2GLC O1 23 2.609 14.403 1.823
2GLC C1 24 2.675 14.276 1.837
2GLC H11 25 2.607 14.204 1.790
3LIN C3 44 3.033 14.281 2.268
3LIN H31 45 3.136 14.298 2.235
4LIN C3 87 3.108 13.927 2.066
4LIN H31 88 3.077 13.879 2.159
etc
1BGL C5 1 2.709 14.491 1.493
1BGL H5 2 2.664 14.412 1.433
1BGL O5 3 2.717 14.464 1.627
1BGL C1 4 2.599 14.430 1.687
1BGL H1 5 2.546 14.350 1.634
2GLC O1 23 2.609 14.403 1.823
2GLC C1 24 2.675 14.276 1.837
2GLC H11 25 2.607 14.204 1.790
3LIN C3 44 3.033 14.281 2.268
3LIN H31 45 3.136 14.298 2.235
4LIN C3 87 3.108 13.927 2.066
4LIN H31 88 3.077 13.879 2.159
etc
20389SOL OW77253 0.644 14.144 5.376
20389SOL HW177254 0.712 14.203 5.344
20389SOL HW277255 0.577 14.201 5.413
6.36535 23.37625 12.09434
我想要输出:
900 mgdg molecules in water t= 600000.00000 step= 400000000
177255
1BGL C5 1 2.709 14.491 1.493
1BGL H5 2 2.664 14.412 1.433
1BGL O5 3 2.717 14.464 1.627
1BGL C1 4 2.599 14.430 1.687
1BGL H1 5 2.546 14.350 1.634
1GLC O1 23 2.609 14.403 1.823
1GLC C1 24 2.675 14.276 1.837
1GLC H11 25 2.607 14.204 1.790
1LIN C3 44 3.033 14.281 2.268
1LIN H31 45 3.136 14.298 2.235
1LIN C3 87 3.108 13.927 2.066
1LIN H31 88 3.077 13.879 2.159
2BGL C5 1 2.709 14.491 1.493
2BGL H5 2 2.664 14.412 1.433
2BGL O5 3 2.717 14.464 1.627
2BGL C1 4 2.599 14.430 1.687
2BGL H1 5 2.546 14.350 1.634
2GLC O1 23 2.609 14.403 1.823
2GLC C1 24 2.675 14.276 1.837
2GLC H11 25 2.607 14.204 1.790
2LIN C3 44 3.033 14.281 2.268
2LIN H31 45 3.136 14.298 2.235
2LIN C3 87 3.108 13.927 2.066
2LIN H31 88 3.077 13.879 2.159
etc
900BGL C5 1 2.709 14.491 1.493
900BGL H5 2 2.664 14.412 1.433
900BGL O5 3 2.717 14.464 1.627
900BGL C1 4 2.599 14.430 1.687
900BGL H1 5 2.546 14.350 1.634
900GLC O1 23 2.609 14.403 1.823
900GLC C1 24 2.675 14.276 1.837
900GLC H11 25 2.607 14.204 1.790
900LIN C3 44 3.033 14.281 2.268
900LIN H31 45 3.136 14.298 2.235
900LIN C3 87 3.108 13.927 2.066
900LIN H31 88 3.077 13.879 2.159
etc
20389SOL OW77253 0.644 14.144 5.376
20389SOL HW177254 0.712 14.203 5.344
20389SOL HW277255 0.577 14.201 5.413
6.36535 23.37625 12.09434
我主要使用这样的脚本,但这种情况比较复杂,这个脚本没用。我知道我应该 prbably 使用计数器,但是如果我有不同的名称(我的意思是 BGL、GLC、LIN)如何打印它并且也很难使用它(FNR%22==0),因为那时我有 5 个 BGL 3 GLC 然后 4 LIN。
#!/bin/bash
awk '
FNR==1{
++count
value=count"BGL" (or whatever)
}
{
=value
}
1
FNR%22==0{
++count
value=count"BGL"
}
' after_SOL.gro | tee after_SOL2.gro
我也会对很多文件执行此操作,因此我会将我的脚本放入 for 循环中:
#!/bin/bash
for num in {1..100};
do
(awk script here) eq4_$num.gro | tee eq5_$num.gro
done
我相信这个脚本完全符合您的要求并保留了输入的表格格式:
#!/bin/bash
awk '
NR <= 2 {print} /* skip two lines of headers */
NR > 2 {
sub(/[0-9]*/, "", );
if ( != prev) {count[]++}
prev =
printf ("%8s %6s %4s %7s %7s %7s\n", count[], , , , , )
} ' data.txt
此脚本应重新编号分子。
#!/usr/bin/gawk -f
BEGIN{ mol=""; prev=""; }
{
gsub(/[0-9]/,"",);
mol=;
if (mol==prev){
nr=m[mol];
}
else {
nr=++m[mol]
};
prev=mol;
print nr[=10=]
}
每个分子('BGL','GLC',LIN')的序列号都保存在数组m[]
中。并随着分子的变化而增加。
我希望这就是计划要做的事情?
我必须更新下面输入文件的第一个字段(不包括前两行是header。第一列中BGL、GLC和LIN之前的数字是一个计数器,必须是以这样一种方式更新,即对于具有相同分子 BCL、GLC 和 LIN 的每一系列记录,计数器都会增加一个。
在我的输入文件的一小段下方(我有 100 个这样的文件):
900 mgdg molecules in water t= 600000.00000 step= 400000000
177255
1BGL C5 1 2.709 14.491 1.493
1BGL H5 2 2.664 14.412 1.433
1BGL O5 3 2.717 14.464 1.627
1BGL C1 4 2.599 14.430 1.687
1BGL H1 5 2.546 14.350 1.634
2GLC O1 23 2.609 14.403 1.823
2GLC C1 24 2.675 14.276 1.837
2GLC H11 25 2.607 14.204 1.790
3LIN C3 44 3.033 14.281 2.268
3LIN H31 45 3.136 14.298 2.235
4LIN C3 87 3.108 13.927 2.066
4LIN H31 88 3.077 13.879 2.159
1BGL C5 1 2.709 14.491 1.493
1BGL H5 2 2.664 14.412 1.433
1BGL O5 3 2.717 14.464 1.627
1BGL C1 4 2.599 14.430 1.687
1BGL H1 5 2.546 14.350 1.634
2GLC O1 23 2.609 14.403 1.823
2GLC C1 24 2.675 14.276 1.837
2GLC H11 25 2.607 14.204 1.790
3LIN C3 44 3.033 14.281 2.268
3LIN H31 45 3.136 14.298 2.235
4LIN C3 87 3.108 13.927 2.066
4LIN H31 88 3.077 13.879 2.159
etc
1BGL C5 1 2.709 14.491 1.493
1BGL H5 2 2.664 14.412 1.433
1BGL O5 3 2.717 14.464 1.627
1BGL C1 4 2.599 14.430 1.687
1BGL H1 5 2.546 14.350 1.634
2GLC O1 23 2.609 14.403 1.823
2GLC C1 24 2.675 14.276 1.837
2GLC H11 25 2.607 14.204 1.790
3LIN C3 44 3.033 14.281 2.268
3LIN H31 45 3.136 14.298 2.235
4LIN C3 87 3.108 13.927 2.066
4LIN H31 88 3.077 13.879 2.159
etc
20389SOL OW77253 0.644 14.144 5.376
20389SOL HW177254 0.712 14.203 5.344
20389SOL HW277255 0.577 14.201 5.413
6.36535 23.37625 12.09434
我想要输出:
900 mgdg molecules in water t= 600000.00000 step= 400000000
177255
1BGL C5 1 2.709 14.491 1.493
1BGL H5 2 2.664 14.412 1.433
1BGL O5 3 2.717 14.464 1.627
1BGL C1 4 2.599 14.430 1.687
1BGL H1 5 2.546 14.350 1.634
1GLC O1 23 2.609 14.403 1.823
1GLC C1 24 2.675 14.276 1.837
1GLC H11 25 2.607 14.204 1.790
1LIN C3 44 3.033 14.281 2.268
1LIN H31 45 3.136 14.298 2.235
1LIN C3 87 3.108 13.927 2.066
1LIN H31 88 3.077 13.879 2.159
2BGL C5 1 2.709 14.491 1.493
2BGL H5 2 2.664 14.412 1.433
2BGL O5 3 2.717 14.464 1.627
2BGL C1 4 2.599 14.430 1.687
2BGL H1 5 2.546 14.350 1.634
2GLC O1 23 2.609 14.403 1.823
2GLC C1 24 2.675 14.276 1.837
2GLC H11 25 2.607 14.204 1.790
2LIN C3 44 3.033 14.281 2.268
2LIN H31 45 3.136 14.298 2.235
2LIN C3 87 3.108 13.927 2.066
2LIN H31 88 3.077 13.879 2.159
etc
900BGL C5 1 2.709 14.491 1.493
900BGL H5 2 2.664 14.412 1.433
900BGL O5 3 2.717 14.464 1.627
900BGL C1 4 2.599 14.430 1.687
900BGL H1 5 2.546 14.350 1.634
900GLC O1 23 2.609 14.403 1.823
900GLC C1 24 2.675 14.276 1.837
900GLC H11 25 2.607 14.204 1.790
900LIN C3 44 3.033 14.281 2.268
900LIN H31 45 3.136 14.298 2.235
900LIN C3 87 3.108 13.927 2.066
900LIN H31 88 3.077 13.879 2.159
etc
20389SOL OW77253 0.644 14.144 5.376
20389SOL HW177254 0.712 14.203 5.344
20389SOL HW277255 0.577 14.201 5.413
6.36535 23.37625 12.09434
我主要使用这样的脚本,但这种情况比较复杂,这个脚本没用。我知道我应该 prbably 使用计数器,但是如果我有不同的名称(我的意思是 BGL、GLC、LIN)如何打印它并且也很难使用它(FNR%22==0),因为那时我有 5 个 BGL 3 GLC 然后 4 LIN。
#!/bin/bash
awk '
FNR==1{
++count
value=count"BGL" (or whatever)
}
{
=value
}
1
FNR%22==0{
++count
value=count"BGL"
}
' after_SOL.gro | tee after_SOL2.gro
我也会对很多文件执行此操作,因此我会将我的脚本放入 for 循环中:
#!/bin/bash
for num in {1..100};
do
(awk script here) eq4_$num.gro | tee eq5_$num.gro
done
我相信这个脚本完全符合您的要求并保留了输入的表格格式:
#!/bin/bash
awk '
NR <= 2 {print} /* skip two lines of headers */
NR > 2 {
sub(/[0-9]*/, "", );
if ( != prev) {count[]++}
prev =
printf ("%8s %6s %4s %7s %7s %7s\n", count[], , , , , )
} ' data.txt
此脚本应重新编号分子。
#!/usr/bin/gawk -f
BEGIN{ mol=""; prev=""; }
{
gsub(/[0-9]/,"",);
mol=;
if (mol==prev){
nr=m[mol];
}
else {
nr=++m[mol]
};
prev=mol;
print nr[=10=]
}
每个分子('BGL','GLC',LIN')的序列号都保存在数组m[]
中。并随着分子的变化而增加。
我希望这就是计划要做的事情?