如何用增量编号替换匹配行中的所有第一次出现?

Ook*_*ker 5 awk shell-script text-processing replace

我有一个这样的文件

...
1562 first part
1563 H     col3 H col4
1564 H     col3 H col4
...
3241 H     col3 H col4
3242 third part
...
Run Code Online (Sandbox Code Playgroud)

我只想将H每一行中的第一个替换为H##是它的出现次数。输出应该是:

...
1562 first part
1563 H1    col3 H col4
1564 H2    col3 H col4
...
3241 H1652 col3 H col4
3242 third part
...
Run Code Online (Sandbox Code Playgroud)

到目前为止,我已经尝试过:

max=`grep -c ' H ' b`
while [[ "$i" -le $max ]];do
  grep -m $i ' H ' b|tail -n1|sed "s/H/H$i/1"
  let i=i+1
done
Run Code Online (Sandbox Code Playgroud)

这段代码很慢,需要读取每一行来替换,不能添加文件的第一部分和第三部分。有没有更好的方法来做到这一点?也许awk?谢谢你。

fed*_*qui 7

例如,您可以使用这个:

$ awk '/H/{sub("H", "H"++v)}1' file
1562 first part
1563 H1     col3 H col4
1564 H2     col3 H col4

3241 H3     col3 H col4
3242 third part
...
Run Code Online (Sandbox Code Playgroud)

这看起来对含有这些线路H和替换HH具有可变我们一起不断递增。请注意gsub()sub()如果您想在所有匹配的模式中执行此更改,而不是仅在一个模式中执行此更改,则可以使用代替。

final1是一个真条件,因此它执行默认的 awk 操作:{print $0},即打印整行。