我的脚本将接收各种长度的输入,并且我想删除最后一个用“ /”分隔的字段。我将要处理的输入示例是
this/that/and/more
但是我遇到的问题是输入的长度会像这样变化:
this/that/maybe/more/and/more
or/even/this/could/be/it/and/maybe/more
short/more
无论如何,预期输出应为整个字符串减去最后一个“ / more”。
注意:这些是任意示例,“更多”一词将不是常量。
示例输入:
this/that/and/more
this/that/maybe/more/and/more
预期输出:
this/that/and
this/that/maybe/more/and
我所知道的适用于您知道长度的字符串
cut -d'/' -f[x]
我需要的是一个'/'分隔的AWK命令,我假设像这样:
awk '{$NF=""; print $0}'
答案 0 :(得分:4)
根据要求使用awk:
def add_dropout(layer_num = None, prob = .4):
#layer num is where you will insert the dropout layer
model = load_model(model_path)
layers_set1 = [layer for layer in model.layers[:layer_num + 1]]
x = layers_set1[-1].output
x = Dropout(prob, name = "drop_test1")(x)
layers_set2 = [layer for layer in model.layers[layer_num+1:]]
for layer in layers_set2:
print(layer)
x = layer(x)
final_model = Model(inputs = layers_set1[0].input, outputs = x)
for num, layer in enumerate(layers_set1):
weights = layer.get_weights()
final_model.layers[num].set_weights(weights)
for num, layer in enumerate(layers_set2, start = len(layers_set1) + 1):
weights = layer.get_weights()
final_model.layers[num].set_weights(weights)
final_model.save(os.path.join(save_dir, "dropout_added.h5"))
但这是sed最适合的工作类型:
$ awk '{sub("/[^/]*$","")} 1' file
this/that/maybe/more/and
or/even/this/could/be/it/and/maybe
short
以上是针对此输入文件运行的:
$ sed 's:/[^/]*$::' file
this/that/maybe/more/and
or/even/this/could/be/it/and/maybe
short
答案 1 :(得分:2)
根据脚本中输入内容的方式,bash的Shell参数扩展可能会很方便:
$ s1=this/that/maybe/more/and/more
$ s2=or/even/this/could/be/it/and/maybe/more
$ s3=short/more
$ echo ${s1%/*}
this/that/maybe/more/and
$ echo ${s2%/*}
or/even/this/could/be/it/and/maybe
$ echo ${s3%/*}
short
(在https://www.gnu.org/software/bash/manual/html_node/Shell-Parameter-Expansion.html处有很多关于参数扩展的附加信息)
答案 2 :(得分:0)
在脚本中,您可以创建一个循环,如果每次迭代中的最后一个字符都不是斜杠,则该循环将删除输入字符串中的最后一个字符。然后,当循环找到斜杠字符时,退出循环,然后删除最后一个字符(应该是斜杠)。
伪代码:
while (lastCharacter != '/') {
removeLastCharacter();
}
removeLastCharacter(); # removes the slash
(对不起,我写了一个bash脚本已经有一段时间了。)
答案 3 :(得分:0)
另一种awk
替代方法,使用字段代替正则表达式
awk -F/ '{printf "%s", $1; for (i=2; i<NF; i++) printf "/%s", $i; printf "\n"}'
答案 4 :(得分:0)
这是替代的shell解决方案:
while read -r path; do dirname "$path"; done < file