awk sub ++每 4 场比赛计数与每 1 场比赛不同

awk sub ++count every 4 matches unlike every 1 match

假设我有以下 1.txt 文件:

    one file.txt
    two file.txt
    three file.txt
    
    four file.txt
    five file.txt
    sixt file.txt

    seven file.txt
    eight file.txt
    nine file.txt

我通常使用下面的命令依次重命名1.txt处列出的文件:

awk '/\.txt/{sub(".txt",++count"&")} 1' 1.txt > 2.txt

输出为2.txt:

one file1.txt
two file2.txt
three file3.txt

four file4.txt
five file5.txt
sixt file6.txt

seven file7.txt
eight file8.txt
nine file9.txt

但是当模式为 .txt.

时,我只想每 4 个匹配重命名一次

澄清一下,伪代码类似于:

awk '/\.txt/{sub(".txt",++count"&")} 1 | <change every 4 matches> ' 1.txt > 3.txt

使得3.txt如下:

one file.txt
two file.txt
three file.txt

four file1.txt <-here
five file.txt
sixt file.txt

seven file.txt
eight file2.txt <- here
nine file.txt

我一直在寻找网络和我的学习,但我不记得类似的东西,我很难开始做一些事情来实现这个结果。

注意:也许我只需要继续下面的命令:

awk -v n=0 '/\.txt/{if (n++==4) sub(".txt",++count"&")} 1'

你快到了。你能试试吗:

awk '/\.txt/ {if (++n%4==0) sub(".txt",++count"&")} 1' 1.txt > 2.txt

条件++n%4==0满足每四行有效。

在此处添加 1 个 awk 变体,仅基于您显示的示例。简单的解释是,检查 line 是否为 NOT NULL AND count 变量值是否为 4,然后将 .txt 替换为 count1(每次增加 1)与 .txt 本身并打印该行。

awk 'NF && ++count==4{sub(/\.txt/,++count1"&");count=0} 1' 1.txt > 2.txt

另一个选项可能是传递 n=4 以将其用于模数和除法。

对于字符串,您可以将 s=".txt" 传递给 index() 以检查它是否存在,并让 sub 用于替换。

awk -v str=".txt" -v nr=4 'index([=10=],str){if(!(++i%nr)) sub(str,i/nr"&")}1' 1.txt > 2.txt