【问题标题】:Separating a nested field into two new fields, maintaining order将嵌套字段分成两个新字段,保持顺序
【发布时间】:2011-07-29 10:33:51
【问题描述】:

我一直在尝试打破如下示例文件,以使第三列成为两部分,同时保持文件内的顺序。

100 400 500.00苹果 5.8 9.2

200 300 600.00狗 5.3 9.1

300 763 454.44小猫 5.7 9.2

应该会导致

100 400 500.00 苹果 5.8 9.2

200 300 600.00 狗 5.3 9.1

300 763 454.44 小猫 5.7 9.2

我在 awk 中尝试过这样做,但似乎遇到了问题。

PS:在正则表达式中,分隔点始终是数字 [0-9] 后跟 [a-zA-Z]。

【问题讨论】:

    标签: sed awk cut


    【解决方案1】:

    试试:

    sed 's/\([0-9]\)\([A-Z]\)/\1 \2/' ./infile
    

    概念证明

    $ sed 's/\([0-9]\)\([A-Z]\)/\1 \2/' ./infile
    100 400 500.00 APPLE 5.8 9.2
    200 300 600.00 DOG 5.3 9.1
    300 763 454.44 KITTEN 5.7 9.2
    

    或者,如果您有 gawk,您可以使用以下方法将拆分限制为仅第三个字段:

    awk '{$3=gensub(/([0-9])([A-Z])/,"\\1 \\2","",$3)}1' ./infile
    

    概念证明

    $ awk '{$3=gensub(/([0-9])([A-Z])/,"\\1 \\2","",$3)}1' ./infile
    100 400 500.00 APPLE 5.8 9.2
    200 300 600.00 DOG 5.3 9.1
    300 763 454.44 KITTEN 5.7 9.2
    

    【讨论】:

    • 太棒了。谢谢。我有点想它可以在 sed 中完成......我看了几眼并阅读了 gnu.org/software/sed/manual/sed.html 以了解您的解决方案是如何工作的,但现在理解它。
    • @jp:没问题。请注意,sed 脚​​本将拆分第一次出现的数字,后跟一个字母。如果在第一个或第二个字段中出现这种模式的行,它拆分它。如果您想确保拆分只发生在第三个字段上,那么awk 脚本就是您要走的路。
    • 为了理解起见,假设我想将其进一步扩展,将 # 符号代替空格,但仅限于数字之间。 IE。 100 400 500.00 APPLE 5.8 9.2 变为 100#400#500.00 APPLE 5.8#9.2。我试图更好地理解 \1 和 \2 但显然它只匹配第一次,第二次出现。如果 sed 支持更复杂的类似临时变量的持有者,那就太好了(但也许支持?)。再次感谢。
    • 啊,明白了/([0-9]) ([0-9])/\1#\2/g
    • 或一次通过:sed -e 's/ /#/g' -e 's/\([0-9]\)\([A-Z]\)/\1 \2/' file
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-08-05
    • 2015-03-05
    • 1970-01-01
    • 2016-04-17
    • 1970-01-01
    • 2019-04-24
    • 1970-01-01
    相关资源
    最近更新 更多