我试着替换像这样的线条:
让我们看一个例子,这个输入:
01 hello
02 stack
02 overflow
04 hi
02 friends = overflow
03 this
03 is
03 my = is
03 life
02 lol
02 im
02 joking = im
03 filler
将生成以下输出(每个hello块是数组的一个元素):
^{pr2}$我试过这样做:
#!/bin/bash
awk '{
if ($0~/=/){
level=$1
oc=1
}else if (oc && $1<=level){
oc=0
}
if (!oc){
print
}
}' input.txt
但是它只返回我需要的第一个输出,我不知道如何跳过03 life
中的03 life
单词。在
如何生成这些输出?在
如果python或perl解决方案更适合您,我不介意。在
下面是一个python脚本,用于读取cobol输入文件并打印出已定义和重新定义的变量的所有可能组合:
如果上面的脚本保存在一个名为
^{pr2}$cobol.py
的文件中,那么If可以作为:定义和重定义的各种可能组合将显示在stdout上。在
这个脚本在python2(2.6+)或python3下运行。在
说明
代码使用三个函数:
readfile
读取输入文件并返回两个变量,它们总结了其中内容的结构。compute
接受两个参数,并从中计算输出块。find_all
确定所有可能的输出块,使用compute
创建它们,然后以列表形式返回它们。让我们更详细地了解每个函数:
readfile
readfile
以输入文件名作为参数,并返回一个列表master
和一个字典namecount
。对于输入文件中的每一个非空行,列表master
都有一个元组,它包含(1)级别号,(2)定义或重新定义的名称,以及(2)原始行本身。对于示例输入文件,readfile
返回master
的值:readfile
还返回字典namecount
,它为每个重新定义的名称提供一个条目,并统计该名称有多少个定义/重定义。对于示例输入文件,namecount
的值为:这表示}各有两个可能的值。在
im
、is
和{readfile
当然是为了处理当前版本的问题中的输入文件格式而设计的。在可能的范围内,它也被设计成与这个问题以前版本的格式一起工作。例如,无论变量重新定义是用等号(当前版本)还是像以前的版本一样使用单词REFDEFINES
来表示,都可以接受。这是为了使这个脚本尽可能灵活。在compute
函数
compute
生成每个输出块。它使用两个参数。第一个是master
,它直接来自readfile
。第二个是skip
,它是从readfile
返回的namecount
字典派生的。例如,namecount
字典说,im
有两个可能的定义。这显示了如何使用compute
为以下各项生成输出块:请注意,上面对
compute
的第一次调用生成了使用im
的第一个定义的块,第二个调用生成了使用第二个定义的块。在find_all
有了以上两个功能,很明显最后一步就是生成所有不同的定义组合并打印出来。这就是函数},它系统地运行所有可用的定义和调用组合
find_all
的作用。使用master
和{compute
,为每个定义和调用创建一个块。它收集所有可以通过这种方式创建的独特块并返回它们。在find_all
返回的输出是字符串列表。每个字符串都是对应于一个定义/重定义组合的块。使用问题的示例输入,显示find_all
返回的内容:作为一个例子,让我们以
find_all
返回的第四个字符串为例,为了获得更好的格式,我们将print
它:在完整的脚本中,
find_all
的输出组合在一起并打印到stdout,如下所示:这样,输出将显示所有可能的块。在
早期版本问题的答案
原始问题的答案
说明:
这个节目具有以下变量:
f
是一个标志,在第一个重定义之前为零,之后为一。s
包含第一个重定义之前的所有文本。t
包含当前重定义的文本。c
是一个计数器,用于确定输出名称的名称。代码的工作原理如下:
f==0 && !/REDEFINES/{s=s"\n"$0;next}
在遇到第一个重定义之前,文本保存在变量
s
中,我们跳过其余的命令并跳转到next
行。/REDEFINES/{f=1;print s t>("output" ++c ".txt");t=""}
每次遇到重定义行时,我们将标志
f
设置为1,并将prolog部分s
和当前的重定义部分一起打印到名为outputn.txt
的文件中,其中n由计数器c
的值代替。在因为我们在一个新的重定义部分的开始,变量
t
被设置为空。{t=t"\n"$0}
将此重定义的当前行保存到变量
t
。END{print s t>("output" ++c ".txt")}
将打印最后一个重定义节的输出文件。
轻微改善
上面代码生成的每个输出文件都有一个前导空白行。{{{cd60>通过下面的函数删除代码:
对于多样性,这个版本的逻辑稍有不同,但在其他方面,会达到相同的结果。在
修改后问题的答案
相关问题 更多 >
编程相关推荐