unix - awk hack 根据计数进行破解
问题描述
;%%%%
我有以下文件,该文件以要拆分的开头
```;%%%ab3579trffe4630
b3579trffe463
fhterringsbfkfgott
${79trsroiuffe4630
fhterringsbfkfgott
${ab3579trffe4630
fhterringsbfkfgott
${trffe4630bgtrep
fhterringsbfkfgott```
文件 1:
``````;%%%ab3579trffe4630
b3579trffe463
fhterringsbfkfgott
${79trsroiuffe4630
fhterringsbfkfgott```
文件 2:
``` ;%%%ab3579trffe4630
fhterringsbfkfgott
${trffe4630bgtrep
fhterringsbfkfgott```
现在我可以获取分隔符计数并将其保存在变量中以拆分我想要使用变量和模式进行拆分的文件,这样就不会丢失数据
解决方案
$ 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
也许逃避正则表达式字符并只进行正则表达式匹配可能更容易。
推荐阅读
- android - android studio中的WebView
- javascript - 数组的值未显示在特定 div 内
- angular - Angular 9 在数组中添加多个对象会覆盖现有数组
- javascript - 这就是范围的全部吗?
- html - Airplay 无法正常工作,我的电视出现黑屏
- symfony - 如何使用 Symfony 5.1、Monolog 和 Mailer 组件配置通过电子邮件发送错误?
- sorting - Solr 使用日光浴室按标题排序
- python - 如何在不关心整个路径的情况下使用 cmd 更改为特定文件夹?
- java - jaxb2-maven-plugin 生成带有 xmlns 前缀的 package-info.java
- c++ - C++ 为什么引用丢失了?