shell 使用awk合并多个字段

af7jpaap  于 2022-11-16  发布在  Shell
关注(0)|答案(4)|浏览(119)

我要从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}'

但是,它并没有像我预期的那样工作。
我做错了什么?
有没有更优雅的方法?

fdbelqdn

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'

输出量

abc/123/efg
zvms9eto

zvms9eto2#

一个想法是递减NF,例如:

$ echo 'abc/123/efg/456' | awk 'BEGIN {FS=OFS="/"} NF--'
abc/123/efg

这是否是“最佳”解决方案将取决于您的其他编码要求,即:

  • 如果您在awk中执行其他工作,则可以将其与其他awk脚本结合使用
  • 如果awk的唯一目的是剥离最后一个场,则这可能是过度的,并且更好的解决方案可能是在bash中执行操作(例如,参数替换、dirname等)
piv4azn7

piv4azn73#

下面是我的方法:删除最后一个字段。是的,就是这么简单。代码:

echo "abc/123/efg/456" | awk -F/ -vOFS=/ '{NF--; print}'

备注

  • 标志-F/指定输入字段分隔符
  • 标志-vOFS=/指定输出字段分隔符
  • NF--语句将字段数减一
  • print语句在删除最后一个字段后打印整个记录(行
t0ybt7op

t0ybt7op4#

最简单的方法(如果您关心额外的空行)
第一个
如果您担心NF一直递减到负区域:

mawk2 'NF -= !!NF' FS='[/]' OFS='/'

或者让FS + OFS帮你擦除它,无风险:

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

如果它们代表任何类型的嵌套文件夹/目录,那么使用这个技巧来获得一个2D树视图:
一个

相关问题