在 AWK 内部分配一个 var 以在 awk 外部使用

assigning a var inside AWK for use outside awk

我在 AIX 上使用 ksh。

我有一个包含多个逗号分隔字段的文件。每个字段的值被读入脚本中的一个变量。

文件中的最后一个字段可能包含多个 |定界值。我需要测试每个值并保留第一个不以 R 开头的值,然后停止测试这些值。

$principal_diagnosis0 的示例值 R65.20|A41.9|G30.9|F02.80

我试过: echo $principal_diagnosis0 | awk -F"|" '{for (i = 1; i<=NF; i++) {if ($i !~ "R"){echo $i; primdiag = $i}}}' 但我收到这条消息:awk: Field $i is not correct.

我的目标是拥有一个可以在 awk 语句之外使用的变量,该变量被分配了第一个非 R 代码(在本例中为 A41.9)。

echo $principal_diagnosis0 | awk -F"|" '{for (i = 1; i<=NF; i++) {if ($i !~ "R"){print $i}}}' 得到我的输出: A41.9 G30.9 F02.80

所以我知道它正在读取值并正确评估。但我需要在第一场比赛后停下来,并能够在 awk 之外使用该值。

谢谢!

你可以让 FSOFS 完成所有艰苦的工作:

echo "${principal_diagnosis0}" |

mawk NF=NF FS='^(R[^|]+[|])+|[|].+$' OFS= 

A41.9

——————————————————————————————————————————

同一概念的另一个略有不同的变体 — 覆盖字段但 OFS 保持原样:

gawk -F'^.*R[^|]+[|]|[|].+$' '$--NF=$--NF' 

A41.9

这是有效的,因为当你把它拆开时:

gawk -F'^.*R[^|]+[|]|[|].+$' '

                       { print NF 
} $(_=--NF)=$(__=--NF) { print _, __, NF, [=12=] }'

3
1 2 1 A41.9

您会注意到您从 NF = 3 开始,随后的两次递减使其等同于 =

但由于最终 NF 现在减少为 1,它会正确打印出来而不是 2 个副本

……也就是说你也可以做到[=22=] = ,像这样:

gawk -F'^.*R[^|]+[|]|[|].+$' '$-_=$-—NF'

A41.9

——————————————————————————————————————————

第三个变体,这次使用 RS 而不是 FS :

mawk NR==2 RS='^.*R[^|]+[|]|[|].+$'

A41.9

——————————————————————————————————————————

如果你真的不想弄乱 FS/OFS/RS,请改用 gsub() :

nawk 'gsub("^.*R[^|]+[|]|[|].+$",_)'
 
A41.9

回答您的具体问题:

$ principal_diagnosis0='R65.20|A41.9|G30.9|F02.80'

$ foo=$(echo "$principal_diagnosis0" | awk -v RS='|' '/^[^R]/{sub(/\n/,""); print; exit}')

$ echo "$foo"
A41.9

以上内容适用于任何 awk,如果你有 GNU awk,你可以更简单地完成它:

foo=$(echo "$principal_diagnosis0" | awk -v RS='[|\n]' '/^[^R]/{print; exit}')