【问题标题】:using awk to extract and split使用 awk 提取和拆分
【发布时间】:2013-05-31 16:55:16
【问题描述】:

我正在尝试从 bash 中的命令答案中提取带有 awk 的子字符串

示例输出行:abc_def_ghi jkl_lmn_opq

获得第二部分很容易

echo abc_def_ghi jkl_lmn_opq | awk '{print $2}'

但是我只需要最后一部分子字符串“opq”并且没有找到让 awk 在字符串上运行两次的方法,当我将结果从上面传递给一个 var 并将这个 var 用于第二个 awk 我得到一个错误,因为字符串是路径,因此是目录。我也没有让 sed 在使用带有字符串的存储 var 时使用相同的错误,并且我没有设法将第一个子字符串传递给第二个 awk 或 sed。诡异的?

如果不是第一个 awk 会打印出来而不是传递给第二个 awk,这将完成这项工作

echo abc_def_ghi jkl_lmn_opq | awk '{print $2}' | awk -F"_" '{print $3}'

都不行

echo abc_def_ghi jkl_lmn_opq | awk '{$2}' | awk -F"_" '{print $3}'

我怎样才能通过它来二次剥离?

【问题讨论】:

    标签: string bash sed awk strip


    【解决方案1】:

    这应该可行:

    $ echo abc_def_ghi jkl_lmn_opq | awk -F_ '{ print $NF}'
    opq
    

    NF 是一个存储字段数量的内置变量。当您使用_ 拆分行并告诉awk 打印$NF 时,您将打印最后一个字段。

    但是,您可能并不总是需要字符串的最后一部分。在这种情况下,您可以在awk 中使用substr 函数。

    使用同样的例子,你可以这样做:

    $ echo abc_def_ghi jkl_lmn_opq | awk ' { print substr($2,9) }'
    opq
    

    substr 函数有 3 个参数,第三个是可选的。第一个参数是有问题的字符串。第二个参数是起点,第三个(可选)参数是您要捕获的长度。如果您不提供它,则默认情况下它将捕获所有内容,直到字符串结束。

    【讨论】:

    • 再次感谢您深入挖掘并提供压缩使用指南,我喜欢 substr 版本,而在这种特殊情况下,我并不总是了解(因为从其他函数返回的字符串)字符串长度,而我我确定这将永远是最后一部分
    • 对于现在需要此解决方案中的第二个(或其他)最后一个子字符串的其他人来说:echo abc_def_ghi jkl_lmn_opq | awk -F_ '{print $(NF-1)}' 虽然我现在不知道如何从字符串的开头开始计数?
    • @peet 你可以随时使用for loop 并使用for (i=1;i<NF;i++) { printf $i FS } print NF
    【解决方案2】:

    您也可以在 bash 中进行参数替换:

    var="abc_def_ghi jkl_lmn_opq";
    echo ${var##*_};
    

    返回

    opq
    

    【讨论】:

    • 一个又好又简单的!在这种情况下,使用echo ... | awk ... 是多余的。
    • echo 只是为了测试输出,如果已经设置了 var,这是非常简单的解决方案,在我的确切情况下,awk 的输入是另一个函数的返回,使用 var 只是我的解决方法,因为没有将第一个剥离的字符串传递给第二个 awk - 但对于现有的 var 来说是一种很酷的方式是的。 (虽然我将不得不[并且会]阅读有关此解决方案的信息以了解:)
    【解决方案3】:
    echo abc_def_ghi jkl_lmn_opq | grep -Po '[^_]+$'
    

    【讨论】:

      【解决方案4】:

      这可能对你有用(GNU sed):

      sed 's/.*_//' <<<"abc_def_ghi jkl_lmn_opq"
      

      【讨论】:

      • 工作,而我没有做对。 s 是分隔开关,第二个是分隔符,但为什么它返回没有第三个参数的最后一个子字符串 - 默认行为?
      • @peet .* 表示找到零个或多个任何单个字符。由于正则表达式引擎是 greedy 它压缩到字符串的末尾。然后它必须回溯,直到找到_。因此,这会在字符串中找到最后一个 _,然后删除所有字符,最后一个 _ 留下所需的结果。请记住,字符串是从abcopq 的所有内容。
      • 感谢您的解释,我将使用什么来获取倒数第二个子字符串?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-08-25
      • 2018-10-23
      • 1970-01-01
      • 2022-11-24
      • 2018-07-31
      • 2018-03-26
      • 1970-01-01
      相关资源
      最近更新 更多