如何在awk命令中将内置变量设置为全局变量?

时间:2019-01-11 16:29:28

标签: bash shell variables awk

当前,我的脚本解析文件并查找特定的模式。每个模式都彼此不同,并且在文件中互斥。例如如果找到“ $ 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命令之外使用它?

感谢您的帮助。

3 个答案:

答案 0 :(得分:0)

能否请您尝试一次,但您的问题尚不清楚。如果您要检查第二个字段以外的其他字段,请更改名为Component 1: state7, state8, state9 (from fetch 3) Component 2: state7, state8, state9 (from fetch 3) Component 3: state7, state8, state9 (from fetch 3) 的变量的值,然后field_value将查找该特定字段。

awk

答案 1 :(得分:0)

也许不能直接,但是如果您可以使用临时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的{​​{1}}。

$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

答案 2 :(得分:0)

您没有提供testdata,因此我将演示如何通过一个简单的问题来设置额外的变量。
假设您的文件只有一行以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
相关问题