繁体   English   中英

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

[英]How do I set a built in variable in awk command to global variable?

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

任何帮助表示赞赏。

您能否再尝试一次,但您的问题尚不清楚。 如果您要检查第二个字段以外的其他字段,请更改名为field_value的变量的值,然后awk将查找该特定字段。

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")

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

您没有提供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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM