将" start" s和" end" s之间的行保存到不同的数组

时间:2017-10-25 19:48:16

标签: bash awk

我有一个由一堆东西组成的文件,但我需要的是开始和结束字符串之间的数字:例如:

ghghgh
start
23
34
22
12
end
ghbd
wodkkh
234
start
14
56
74
end

所以,我需要两个数组,其中一个包含23,34,22,12,另一个包含14,56,74。什么是最好的命令?

如果我只有一个开始和一个结束,我将能够使用mapfile和awk来获取该数组,但是文件中有很多开始和结束,我需要保存所有数组。

4 个答案:

答案 0 :(得分:1)

您可以使用from bokeh.plotting import figure from bokeh.io import curdoc from bokeh.layouts import row, column, widgetbox from bokeh.embed import notebook_div from bokeh.models.widgets import Slider, TextInput, Button, Toggle from mayavi import mlab import numpy as np # Set up plot plot = figure(x_axis_location=None, y_axis_location=None, plot_width=400, plot_height=400, title = "3D plot", logo=None) def MayaviPlot(attrname, old, new): mlab.clf() phi, theta = np.mgrid[0:np.pi:11j, 0:2*np.pi:11j] x = np.sin(phi) * np.cos(theta) y = np.sin(phi) * np.sin(theta) z = np.cos(phi) mlab.mesh(x, y, z) mlab.mesh(x, y, z, representation='wireframe', color=(0, 0, 0)) mlab.show() button1 = Toggle(label="Plot", button_type="success") button1.on_change('active', MayaviPlot) inputs = button1 outputs = plot curdoc().add_root(row(inputs, outputs, width=1000)) curdoc().title = "Test"

sed

代码将遍历' start'之间的所有块。并且'结束'线。 它将删除所有带有非数字符号的项目,并输出每个"数组"在另一条线上。

以下是数据样本的输出:

sed -n '/start/{:a;N;/end/!ba;s/\n/, /g;s/, [^,][a-z][^,]*//Ig;s/start, //p}'

答案 1 :(得分:1)

您需要实现一个小型状态机 - 在块内和块之间切换:

awk '/end/{block = 0; print a; a = ""} (block) {a = a " " $0} /start/{block = 1}'

如果在end,请保留块,打印并清空累加器。如果在块中,则累积当前行。如果在开始时,请标记我们在一个区块内。

答案 2 :(得分:1)

每次新序列开始时,您都可以告诉awk更改输出文件

awk '/start/{i++;f=1;next} /end/{f=0} f{print > "arr"i}' file

对于示例文件,这将创建文件:arr1arr2。然后,您可以使用这些文件的行创建分隔的数组:

for i in $( ls arr* ); do readarray -t $i < $i; done

注意:我假设匹配模式之间的所有行都是数字的,并且在示例中是可接受的。

答案 3 :(得分:1)

如果您完全相信输入文件的eval:

$ cat tst.sh
eval $(
    awk '
        f {
            if ( /end/ ) {
                print "declare arr" ++cnt "=(" vals " )"
                vals = ""
                f = 0
            }
            else {
                vals = vals OFS $0
            }
        }
        /start/ { f = 1 }
    ' "$1"
)

printf "arr1:%s\n" "${arr1[@]}"
printf "arr2:%s\n" "${arr2[@]}"

$ ./tst.sh file
arr1:23
arr1:34
arr1:22
arr1:12
arr2:14
arr2:56
arr2:74

检查引用和所有其他shell陷阱......