用awk基于另一文件行范围替换多文件中group_tree(与\t间指定频次内容
核心问题说明
你的代码存在三个典型错误:
- 重复计数:在
int(j++/N)中已经完成了计数器自增,sub成功后又额外执行j++,导致计数器每次跳2,匹配逻辑完全错乱 - 数组越界:4.txt原写法
int(n++/2)%2+4会得到索引4、5交替的结果,但存储1.txt内容的数组a只有0-4共5个元素,a[5]为空,所以出现了group_tree()的空括号情况 - 参数逻辑错误:要实现连续N行用同一个替换内容,应该修改
/后面的数值,而非%后面的数值
a[int(j++/N)%M + K]参数含义 该表达式用于控制替换内容的选择逻辑,各参数作用如下:
a:存储替换源文件(此处为1.txt)每行内容的数组,索引从0开始,a[0]对应1.txt第1行,a[4]对应1.txt第5行j:当前已处理的待替换匹配行的计数器,每处理一行匹配成功的行自动加1N:同一个替换内容连续使用的行数,比如要连续3行用同一段内容替换,N就设为3M:循环使用的替换内容总条数,比如要循环使用1.txt的前3条内容,M就设为3K:替换内容的起始索引,即从数组a的第K位开始取内容,比如要从1.txt第4行(对应a[3])开始用,K就设为3
修正后代码
awk \ 'FNR==1 {++f} f==1 {a[i++]=$0} f==2 {if (sub(/group_tree[[:space:]]*\(.*\)\\t",$/,"group_tree("a[int(j++/3)%3+0]")\\t\"")); print > "2.txt"} f==3 {if (sub(/group_tree[[:space:]]*\(.*\)\\t",$/,"group_tree("a[int(k++/2)%2+3]")\\t\"")); print > "3.txt"} f==4 {if (sub(/group_tree[[:space:]]*\(.*\)\\t",$/,"group_tree("a[4]")\\t\"")); print > "4.txt"} ' \ 1.txt 0.txt 0-1.txt 0-2.txt
4.txt因为全程使用同一段替换内容,直接写
a[4]即可,不需要复杂表达式。
内容的提问来源于stack exchange,提问作者7beggars_nnnnm
相关产品推荐
相关产品推荐

