重复第 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
下面的文件包含 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