【问题标题】:How do I set a built in variable in awk command to global variable?如何将 awk 命令中的内置变量设置为全局变量?
【发布时间】:2023-03-14 06:37:01
【问题描述】:

目前,我的脚本解析文件并查找特定模式。每个模式都彼此不同,并且在文件中是互斥的。例如如果找到“$identifier1”,则“$identifier2”和“$identifier3”不能在文件中。

exist=`awk -v v1="$identifer1" -v v2="$identifier2" -v v3="$identifier3" 'BEGIN{FS=":"; OFS="-"} $2 == v1 || $2 == v2 || $2 == v3 {print}' $file`

问题是:在比较过程中($2 == v1 || $2 == v2 || $2 == v3),如何将 $2 设置为全局变量,以便在 awk 命令之外使用它?

感谢任何帮助。

【问题讨论】:

  • 你不能。如果您更新您的问题以描述您正在尝试做什么(打印一些东西?将一些值保存到文件中?填充一个 shell 变量?)而不是您尝试如何去做(使 $2 在 awk 脚本之外可用) 那么我们可以帮助您做任何您想做的事情。

标签: bash shell variables awk


【解决方案1】:

您能否尝试关注一次,但您的问题不清楚。如果您想检查与 2nd 不同的字段,则更改名为 field_valueawk 的变量的值将查找该特定字段。

field_value="2"
exist=$(awk -v v1="$identifer1" -v v2="$identifier2" -v v3="$identifier3" -v field="$field_value" 'BEGIN{FS=":"; OFS="-"} $field == v1 || $field == v2 || $field == v3 {print}' "$file")

【讨论】:

    【解决方案2】:

    也许不能直接,但如果临时 IO 对你没问题...
    您可以将$2 写入临时文件,然后再读入变量,如下所示:

    exist=`awk -v v1="$identifer1" -v v2="$identifier2" -v v3="$identifier3" 'BEGIN{FS=":"; OFS="-"} $2 == v1 || $2 == v2 || $2 == v3 {print} {printf $2>"_tmpfile_for_v_"}' $file`
    tmpv=$(<_tmpfile_for_v_)
    rm _tmpfile_for_v_
    

    现在您可以使用$tmpv 存储的$2

    顺便说一句awk 命令可以改进一点:

    awk -v v1="$identifer1" -v v2="$identifier2" -v v3="$identifier3" 'BEGIN{FS=":"; OFS="-"} {printf $2>"_tmpfile_for_v_"} $2 == v1 || $2 == v2 || $2 == v3 ' $file
    

    如果没有给出块,则暗示{print}

    【讨论】:

      【解决方案3】:

      您没有提供测试数据,因此我将演示如何通过简化问题设置额外变量。
      假设您有一个文件,其中只有一行以 1 开头(类似 1 2 3 的行)。
      如何使用awk 填充两个变量,一个以 1 开头的行,另一个以第二个字段?
      您可以找到带有

      的行
         line=$(awk '/^1/ {print}' file)
      

      现在你想做类似的事情

        awk '/1^/ {print "line=" $0; print "field2=" $2}' file
      

      当您知道该行没有# 时,您可以使用

      IFS='#" read -r line field2 <<< $(awk '/^1/ {print $0 "#" $2}' file
      

      【讨论】:

        猜你喜欢
        • 2016-06-16
        • 2012-09-27
        • 1970-01-01
        • 1970-01-01
        • 2017-04-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-06-21
        相关资源
        最近更新 更多