首页 > 解决方案 > awk hack 根据计数进行破解

问题描述

;%%%%我有以下文件,该文件以要拆分的开头

```;%%%ab3579trffe4630
    b3579trffe463
    fhterringsbfkfgott
  ${79trsroiuffe4630
  fhterringsbfkfgott
   ${ab3579trffe4630
  fhterringsbfkfgott
  ${trffe4630bgtrep
fhterringsbfkfgott```

文件 1:

``````;%%%ab3579trffe4630
    b3579trffe463
    fhterringsbfkfgott
  ${79trsroiuffe4630
  fhterringsbfkfgott```

文件 2:

``` ;%%%ab3579trffe4630
  fhterringsbfkfgott
  ${trffe4630bgtrep
fhterringsbfkfgott```

现在我可以获取分隔符计数并将其保存在变量中以拆分我想要使用变量和模式进行拆分的文件,这样就不会丢失数据

标签: unixawksplit

解决方案


$ awk -v mark='${' -v c=2 'index($0,mark) {++i} 
                                          {print > ("file."int((i-1)/c+1))}' file

或更简单

 $ awk -v mark='${' -v c=2 'index($0,mark){f="file." int(i++/c+1)} {print > f}'

$ head file.?
==> file.1 <==
${ab3579trffe4630
    b3579trffe463
    fhterringsbfkfgott
  ${79trsroiuffe4630
  fhterringsbfkfgott

==> file.2 <==
   ${ab3579trffe4630
  fhterringsbfkfgott
  ${trffe4630bgtrep
fhterringsbfkfgott

假设每行只出现一个标记。您指定每个拆分文件的计数。

当在一行中遇到文字标记时增加一个计数器。将行打印到一个文件,文件名后缀是这样排列的,这样最多c将转到第一个文件,下一批到第二个,等等。

由于您使用的是特殊字符,因此这不是正则表达式匹配,因此您不能指定|条件。

对于多个标记的文字匹配,您可以执行

$ awk -v marks='${|$^' -v c=2 '
        BEGIN{n=split(marks,m,"|"); f="file.1"} 
             {for(i=1;i<=n;i++) 
                if(index($0,m[i])) 
                   {f="file." int(fc++/c+1); break}} 
             {print > f}' file

也许逃避正则表达式字符并只进行正则表达式匹配可能更容易。


推荐阅读