使用awk组合多个字段



我想从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' |
nawk 'NF=(-_<NF) * 3' FS='[/]' OFS='/'    
mawk 'NF * (NF = 3)' FS='[/]' OFS='/'
果你担心NF一直递减到负区:
mawk2 'NF -= !!NF' FS='[/]' OFS='/'

或者只让FS + OFS为u清除它,无风险:

gawk NF=NF FS='[/][^/]*$' OFS=

如果这些表示任何类型的嵌套文件夹/目录,那么使用此技巧可以获得2D树视图:

nawk 'NF-=!!NF' FS='[/]' OFS='fb/'

相关内容

  • 没有找到相关文章

最新更新