【问题标题】:Split a string using a string as delimiter in awk在 awk 中使用字符串作为分隔符拆分字符串
【发布时间】:2014-01-14 07:13:32
【问题描述】:

系统:Solaris 我正在尝试使用分隔符将字符串拆分为另一个字符串

例如:


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

我想把它从“根”子字符串分成两部分,这样

$1 = /as/asdasd/asdasd/

$2 = asdqwe/asd/asssdd/

这是我使用 FS 实现的代码,但是不起作用:

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

【问题讨论】:

    标签: shell unix awk substring


    【解决方案1】:

    无需使用 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函数??
    • 非常感谢围攻...我尝试使用“root”而不是“/root/”进行拆分...这是错误...再次感谢
    • @siege:我刚刚在 Solaris 中尝试过...显然即使 split 也有同样的问题...抱歉没有尝试就将其标记为正确
    • @Siege:显然 nawk 用 split 和 FS 都做到了 .. 只是想我会更新你 ...... 谢谢你的帮助。 :)
    【解决方案2】:

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

    【讨论】:

    • 究竟什么是“不起作用”?另外,您使用的是哪个awk?有几个,具有细微的行为差异(IIRC 其中一个希望在这些块之间看到换行符,空间不够好)。
    • 好吧...如果我尝试执行上面的命令。它仅在“r”而不是“root”处拆分字符串。因此输出为“oot/asdqwe/asd/asssdd/”。我猜它的solaris awk ..因为它说/usr/bin
    • /usr/xpg6/bin 中应该有一个,或者本周的任何内容。此外,可能还有nawk。但是awk 一直对FS 使用正则表达式,除非出现错误。
    • 是的 .. 我也读到过将正则表达式与 FS 一起使用.... 这很奇怪...我会尝试 nawk 并让你知道... thnks 输入
    • 更新:Nawk 工作出色......谢谢......如果你能更新你的答案,我会正确标记它......
    猜你喜欢
    • 1970-01-01
    • 2015-12-28
    • 1970-01-01
    • 1970-01-01
    • 2014-06-29
    • 1970-01-01
    • 1970-01-01
    • 2011-12-17
    • 1970-01-01
    相关资源
    最近更新 更多