使用awk将字符串按照指定的分隔符拆分

7

系统:Solaris 我正在尝试使用另一个字符串作为定界符来拆分字符串。

例如:


主字符串是:/as/asdasd/asdasd/root/asdqwe/asd/asssdd/

我想要从“root”子字符串将其拆分为两部分,使得

$1 = /as/asdasd/asdasd/

$2 = asdqwe/asd/asssdd/

这是我使用FS实现的代码,但它不能正常工作:

echo /as/asdasd/asdasd/root/asdqwe/asd/asssdd/ | awk '
BEGIN { FS = "root" } { print $2 }'
2个回答

6
不需要使用 awk ,您可以使用POSIX shell来完成此操作,如下所示:
$ var="/as/asdasd/asdasd/root/asdqwe/asd/asssdd/"

$ echo ${var%/root/*}
/as/asdasd/asdasd

$ echo ${var#*/root/}
asdqwe/asd/asssdd/

更新

如果你的Solaris版本的awk无法工作(可能是因为FS必须是字符而不是字符串),那么尝试使用split()方法。

awk '{split($0,a,"/root/");$1=a[1] "/"; $2=a[2]; print $1,$2}'

@Siege:有没有办法在awk中使用FS或split函数来完成这个操作? - tomkaith13
非常感谢Siege...我尝试使用"root"而不是"/root/"进行分割...那就是错误所在...再次感谢。 - tomkaith13
@siege:我刚在Solaris上尝试了一下...显然,即使是split也有同样的问题...很抱歉在没有尝试过的情况下就标记它为正确答案。 - tomkaith13
@Siege:显然,nawk在使用split和FS时都能胜任。只是想更新一下您...感谢帮助。 :) - tomkaith13

4

这里可以工作,除了你没有处理的额外的/。也许你想要"root/"作为你的分隔符?可能还需要使用更新的awk; Solaris仍然将古老的V7 Unix awk作为/usr/bin/awk提供,符合POSIX标准的awk/usr/bin/nawk


1
“doesn't work” 究竟是什么意思?另外,你用的是哪个 awk?有几个版本,行为差异微妙(如果我没记错的话,其中一个要在这些块之间看到一个换行符,空格不够好)。 - geekosaur
嗯...如果我尝试执行上面的命令。它只在"r"处而不是"root"处分割字符串。因此输出为"oot/asdqwe/asd/asssdd/"。我猜这是Solaris的awk,因为它说/usr/bin。 - tomkaith13
应该在 /usr/xpg6/bin 中有一个,或者是这周的其他地方。另外,可能会有一个 nawk。但是,除了错误之外,awk 一直使用正则表达式作为 FS - geekosaur
是的,我也读到了使用正则表达式和FS的方法...感觉有点奇怪...我会尝试使用nawk并告诉你结果...谢谢你的建议。 - tomkaith13
更新:Nawk工作得非常好....谢谢...如果您能更新您的答案,我会标记它正确... - tomkaith13

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接