重复第 n 个数字直到第 n 个匹配,同时使用 awk sub 在模式中为这些数字添加前缀

Repeat nth number until the nth match while prefixing these number at the pattern using awk sub

下面的文件包含 15 次字符串 .dog。 通常当我想在字符串中附加任何数字进行计数时,我使用 awk '/\.dog/{sub(".dog",++count"&")} 1' 并且还多次使用此命令的一些变体,如这个问题 .

 [.dog]
-house
[.cat]
-kitchen
[.dog]
-house
[.cat]
-kitchen
[.dog]
-house
[.cat]
-kitchen
[.dog]
-house
[.cat]
-kitchen
[.dog]
-house
[.cat]
-kitchen
[.dog]
-house
[.cat]
-kitchen
[.dog]
-house
[.cat]
-kitchen
[.dog]
-house
[.cat]
-kitchen
[.dog]
-house
[.cat]
-kitchen
[.dog]
-house
[.cat]
-kitchen
[.dog]
-house
[.cat]
-kitchen
[.dog]
-house
[.cat]
-kitchen
[.dog]
-house
[.cat]
-kitchen
[.dog]
-house
[.cat]
-kitchen
[.dog]

目前我不得不做一些不同的事情,以便将唯一的 nth number 附加到 nth match,也就是说,每个 nth 数字(1、2、3 等)重复直到 nth match。假设我希望它 .dog 成为我的模式,并且最多 5 nth 匹配 .dog awk.. gsub.. count 命令重复 1 同时追加一个数字。所以我的输出应该是:

[1.dog]
-house
[.cat]
-kitchen
[1.dog]
-house
[.cat]
-kitchen
[1.dog]
-house
[.cat]
-kitchen
[1.dog]
-house
[.cat]
-kitchen
[1.dog]
-house
[.cat]
-kitchen
[2.dog]
-house
[.cat]
-kitchen
[2.dog]
-house
[.cat]
-kitchen
[2.dog]
-house
[.cat]
-kitchen
[2.dog]
-house
[.cat]
-kitchen
[2.dog]
-house
[.cat]
-kitchen
[3.dog]
-house
[.cat]
-kitchen
[3.dog]
-house
[.cat]
-kitchen
[3.dog]
-house
[.cat]
-kitchen
[3.dog]
-house
[.cat]
-kitchen
[3.dog]

我一直在寻找一个解决方案,但我没有找到,我相信可以再次找到这个解决方案来操纵和适应awk '/\.dog/{sub(".dog",++count"&")} 1 | <at the every 5 matches> ',但我仍然不确定。

你可以试试这个awk

$ awk 'BEGIN{FS=OFS="["} {split(,a,".")}/dog/{a[1]=int(dog++/5);=a[1]+1"."a[2]}1' input_file

通过将 dog 的每个匹配项拆分为 20% 或 0.2,这将在一个整数内生成 5 个匹配项,int 抑制浮点数,因此可能有更好的方法。

输出

$ awk 'BEGIN{FS=OFS="["} {split(,a,".")}/dog/{a[1]=int(dog++/5);=a[1]+1"."a[2]}1' input_file
[1.dog]
-house
[.cat]
-kitchen
[1.dog]
-house
[.cat]
-kitchen
[1.dog]
-house
[.cat]
-kitchen
[1.dog]
-house
[.cat]
-kitchen
[1.dog]
-house
[.cat]
-kitchen
[2.dog]
-house
[.cat]
-kitchen
[2.dog]
-house
[.cat]
-kitchen
[2.dog]
-house
[.cat]
-kitchen
[2.dog]
-house
[.cat]
-kitchen
[2.dog]
-house
[.cat]
-kitchen
[3.dog]
-house
[.cat]
-kitchen
[3.dog]
-house
[.cat]
-kitchen
[3.dog]
-house
[.cat]
-kitchen
[3.dog]
-house
[.cat]
-kitchen
[3.dog]
$ awk '[=10=]=="[.dog]"{ if (++cnt % 5 == 1) idx++; sub(/\./,idx".") } 1' file
[1.dog]
-house
[.cat]
-kitchen
[1.dog]
-house
[.cat]
-kitchen
[1.dog]
-house
[.cat]
-kitchen
[1.dog]
-house
[.cat]
-kitchen
[1.dog]
-house
[.cat]
-kitchen
[2.dog]
-house
[.cat]
-kitchen
[2.dog]
-house
[.cat]
-kitchen
[2.dog]
-house
[.cat]
-kitchen
[2.dog]
-house
[.cat]
-kitchen
[2.dog]
-house
[.cat]
-kitchen
[3.dog]
-house
[.cat]
-kitchen
[3.dog]
-house
[.cat]
-kitchen
[3.dog]
-house
[.cat]
-kitchen
[3.dog]
-house
[.cat]
-kitchen
[3.dog]

用户@Cyrus 的回答:

awk 'BEGIN{ count=1 } /\.dog/{ t=count; sub(/\..*/,"",t); sub(".dog", t "&"); count+=.2 }1' file