删除最后一个字段

时间:2019-06-11 23:45:33

标签: awk

我的脚本将接收各种长度的输入,并且我想删除最后一个用“ /”分隔的字段。我将要处理的输入示例是

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}'

5 个答案:

答案 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