我有一个由一堆东西组成的文件,但我需要的是开始和结束字符串之间的数字:例如:
ghghgh
start
23
34
22
12
end
ghbd
wodkkh
234
start
14
56
74
end
所以,我需要两个数组,其中一个包含23,34,22,12,另一个包含14,56,74。什么是最好的命令?
如果我只有一个开始和一个结束,我将能够使用mapfile和awk来获取该数组,但是文件中有很多开始和结束,我需要保存所有数组。
答案 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
对于示例文件,这将创建文件:arr1
,arr2
。然后,您可以使用这些文件的行创建分隔的数组:
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陷阱......