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

Posted

技术标签:

【中文标题】awk sub ++count 每 4 场比赛与每 1 场比赛不同【英文标题】:awk sub ++count every 4 matches unlike every 1 match 【发布时间】:2021-11-24 12:33:14 【问题描述】:

假设我在下面有以下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'

【问题讨论】:

【参考方案1】:

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

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

【讨论】:

【参考方案2】:

你快到了。请你试试:

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

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

【讨论】:

【参考方案3】:

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

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

awk -v str=".txt" -v nr=4 'index($0,str)if(!(++i%nr)) sub(str,i/nr"&")1' 1.txt > 2.txt

【讨论】:

以上是关于awk sub ++count 每 4 场比赛与每 1 场比赛不同的主要内容,如果未能解决你的问题,请参考以下文章

awk详解 数组

有关最近的几场比赛

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

64匹马,8个赛道,找出前4名最少比赛多少场?——最快10次,最慢11次;

[ZJOI2008]泡泡堂

64匹马8赛道,知识多少轮比赛找出速度最快的4匹马?