<p>如果您的实际输入文件与您发布的内容相同,那么即使在下面也可以给出所需的输出。你知道吗</p>
<pre><code>awk 'BEGIN{split("R,S,T",a,/,/)}f=$2~/^H[0-9]+$/{$2 = $2 a[++c]}!f{c=0}1' infile
</code></pre>
<p><strong>解释</strong></p>
<ul>
<li><p><code>split("R,S,T",a,/,/)</code>-用分隔符逗号分割字符串<code>"R,S,T"</code>,并保存在数组<code>a</code>,因此它变成<code>a[1] = R, a[2] = S, a[3] = T</code></p></li>
<li><p><code>f=$2~/^H[0-9]+$/</code>-<code>f</code>是变量,请验证regexp<code>$2 ~ /^H[0-9]+$/</code>,它返回布尔状态。如果它返回<code>true</code>,那么变量<code>f</code>将为真,否则<code>false</code></p></li>
<li><p><code>$2 = $2 a[++c]</code>如果上面的一个为真,那么修改第二个字段,这样第二个字段将有现有值加上数组<code>a</code>值,对应于索引(<code>c</code>),<code>++c</code>是预增量变量</p></li>
<li><p><code>!f{c=0}</code>如果变量<code>f</code>为false,则重置变量<code>c</code>,而不是连续的。</p></li>
<li><p><code>1</code>在末尾执行默认操作,即print current/record/row,<code>print $0</code>。要了解awk的工作原理,请尝试<code>awk '1' infile</code>,它将打印所有记录/行,而<code>awk '0' infile</code>不打印任何内容。除零以外的任何数字都是<em>真</em>,这将触发默认行为。</p></li>
</ul>
<p>测试结果:</p>
<pre><code>$ cat infile
1ECLI H813 98 7.529 8.326 9.267
1ECLI H813 99 7.427 8.470 9.251
1ECLI C814 100 7.621 8.513 9.263
1ECLI H814 101 7.607 8.617 9.289
1ECLI H814 102 7.633 8.489 9.156
1ECLI H814 103 7.721 8.509 9.305
1ECLI C74 104 8.164 8.733 10.740
1ECLI H74R 105 8.247 8.690 10.799
$ awk 'BEGIN{split("R,S,T",a,/,/)}f=$2~/^H[0-9]+$/{$2 = $2 a[++c]}!f{c=0}1' infile
1ECLI H813R 98 7.529 8.326 9.267
1ECLI H813S 99 7.427 8.470 9.251
1ECLI C814 100 7.621 8.513 9.263
1ECLI H814R 101 7.607 8.617 9.289
1ECLI H814S 102 7.633 8.489 9.156
1ECLI H814T 103 7.721 8.509 9.305
1ECLI C74 104 8.164 8.733 10.740
1ECLI H74R 105 8.247 8.690 10.799
</code></pre>
<p>如果您想要更好的格式,比如<code>tab</code>或其他字符作为字段分隔符,那么您可以使用下面的一个,modify <code>OFS</code>变量</p>
<pre><code>$ awk -v OFS="\t" 'BEGIN{split("R,S,T",a,/,/)}f=$2~/^H[0-9]+$/{$2 = $2 a[++c]}!f{c=0}{$1=$1}1' infile
1ECLI H813R 98 7.529 8.326 9.267
1ECLI H813S 99 7.427 8.470 9.251
1ECLI C814 100 7.621 8.513 9.263
1ECLI H814R 101 7.607 8.617 9.289
1ECLI H814S 102 7.633 8.489 9.156
1ECLI H814T 103 7.721 8.509 9.305
1ECLI C74 104 8.164 8.733 10.740
1ECLI H74R 105 8.247 8.690 10.799
</code></pre>