我想从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}'
然而,它并没有像我预期的那样起作用。
我做错了什么?
有什么方法可以更优雅地做到这一点吗?
修复代码:
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'
输出
abc/123/efg
一个想法是减少NF
,例如:
$ echo 'abc/123/efg/456' | awk 'BEGIN {FS=OFS="/"} NF--'
abc/123/efg
这是否是"最佳"解决方案将取决于您的其他编码要求,即:
- 如果您在
awk
中执行额外的工作,则可以将其与其他awk
脚本结合使用 - 如果
awk
的唯一目的是去掉最后一个字段,那么这可能是过度杀伤,更好的解决方案可能是在bash
中执行操作(例如,参数替换、dirname
等(
下面是我的方法:删除最后一个字段。是的,就这么简单。代码:
echo "abc/123/efg/456" | awk -F/ -vOFS=/ '{NF--; print}'
票据
- 标志
-F/
指定输入字段分隔符 - 标志
-vOFS=/
指定输出字段分隔符 NF--
语句将字段数减少一print
语句在删除最后一个字段后打印整个记录(行(
最简单的方法(如果您关心额外的空行(
echo 'abc/123/efg/456nn' |
果你担心NF一直递减到负区:nawk 'NF=(-_<NF) * 3' FS='[/]' OFS='/' mawk 'NF * (NF = 3)' FS='[/]' OFS='/'
mawk2 'NF -= !!NF' FS='[/]' OFS='/'
或者只让
FS + OFS
为u清除它,无风险:gawk NF=NF FS='[/][^/]*$' OFS=
如果这些表示任何类型的嵌套文件夹/目录,那么使用此技巧可以获得2D树视图:
nawk 'NF-=!!NF' FS='[/]' OFS='fb/'