在 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 之外使用该值。
谢谢!
你可以让 FS
和 OFS
完成所有艰苦的工作:
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}')
我在 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 之外使用该值。
谢谢!
你可以让 FS
和 OFS
完成所有艰苦的工作:
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}')