我要从abc/123/efg/456取得abc/123/efg我尝试获取第一个NF - 1字段,并将它们与/连接起来。于是我照做:
abc/123/efg/456
abc/123/efg
NF - 1
/
echo abc/123/efg/456 | awk -F "/" 'BEGIN {OFS="/"} {for(i=1;i<=NF-1;i++) {var = var+$i} END {print var}'
但是,它并没有像我预期的那样工作。我做错了什么?有没有更优雅的方法?
fdbelqdn1#
要修复代码,请执行以下操作:
echo "abc/123/efg/456" | awk -F "/" 'BEGIN {OFS="/"} { for(i=1;i<NF;i++) var = (var ? var OFS : "") $i } END {print var}'
或者,您也可以移除从最后一个出现的/开始,直到字串结尾为止。
echo "abc/123/efg/456" | awk '{sub("/[^/]*$", "")}1'
输出量
zvms9eto2#
一个想法是递减NF,例如:
NF
$ echo 'abc/123/efg/456' | awk 'BEGIN {FS=OFS="/"} NF--' abc/123/efg
这是否是“最佳”解决方案将取决于您的其他编码要求,即:
awk
bash
dirname
piv4azn73#
下面是我的方法:删除最后一个字段。是的,就是这么简单。代码:
echo "abc/123/efg/456" | awk -F/ -vOFS=/ '{NF--; print}'
备注
-F/
-vOFS=/
NF--
print
t0ybt7op4#
最简单的方法(如果您关心额外的空行)第一个如果您担心NF一直递减到负区域:
mawk2 'NF -= !!NF' FS='[/]' OFS='/'
或者让FS + OFS帮你擦除它,无风险:
FS + OFS
gawk NF=NF FS='[/][^/]*$' OFS=
如果它们代表任何类型的嵌套文件夹/目录,那么使用这个技巧来获得一个2D树视图:一个
4条答案
按热度按时间fdbelqdn1#
要修复代码,请执行以下操作:
或者,您也可以移除从最后一个出现的
/
开始,直到字串结尾为止。输出量
zvms9eto2#
一个想法是递减
NF
,例如:这是否是“最佳”解决方案将取决于您的其他编码要求,即:
awk
中执行其他工作,则可以将其与其他awk
脚本结合使用awk
的唯一目的是剥离最后一个场,则这可能是过度的,并且更好的解决方案可能是在bash
中执行操作(例如,参数替换、dirname
等)piv4azn73#
下面是我的方法:删除最后一个字段。是的,就是这么简单。代码:
备注
-F/
指定输入字段分隔符-vOFS=/
指定输出字段分隔符NF--
语句将字段数减一print
语句在删除最后一个字段后打印整个记录(行t0ybt7op4#
最简单的方法(如果您关心额外的空行)
第一个
如果您担心NF一直递减到负区域:
或者让
FS + OFS
帮你擦除它,无风险:如果它们代表任何类型的嵌套文件夹/目录,那么使用这个技巧来获得一个2D树视图:
一个