在awk中使用以空行分隔的记录和以冒号分隔的字段

在awk中使用以空行分隔的记录和以冒号分隔的字段,awk,etl,Awk,Etl,我希望能够在awk中处理一个文件,其中记录由一个空行分隔,每个字段由一个名称后跟一个冒号、一些可忽略/丢弃的可选空白以及一个值组成。例如 Name: Smith, John Age: 42 Name: Jones, Mary Age: 38 Name: Mills, Pat Age: 62 我知道我可以使用RS=“让awk将空行理解为记录分隔符,并使用FS=“\n”正确分割字段。但是,我想创建一个name→值对,可用于表单的进一步处理 if a["Age"] > 40 {print

我希望能够在
awk
中处理一个文件,其中记录由一个空行分隔,每个字段由一个名称后跟一个冒号、一些可忽略/丢弃的可选空白以及一个值组成。例如

Name: Smith, John
Age: 42

Name: Jones, Mary
Age: 38

Name: Mills, Pat
Age: 62
我知道我可以使用
RS=“
awk
将空行理解为记录分隔符,并使用
FS=“\n”
正确分割字段。但是,我想创建一个
name
→<代码>值对,可用于表单的进一步处理

if a["Age"] > 40 {print a["Name"]}
顺序通常是一致的,但由于它将被转储到关联数组中,因此传入的顺序不重要,也不应假定为一致的

如何以最少的麻烦将数据转换为
awk
关联数组?

方法1 我们使用
split
将每个字段分为两部分:键和值。根据这些,我们创建关联数组
a

$ awk -F'\n' -v RS=  '{for (i=1;i<=NF;i++) {split($i,arr,/: /); a[arr[1]]=arr[2];} if (a["Age"]+0>40) print a["Name"];}' file
Smith, John
Mills, Pat
对于其他AWK,您可能需要一次删除一个数组元素,如:

for (k in a) delete a[k];

delete array
现在是POSIX,因此不再是特定于gawk的。我将您的方法1与您的
delete a
改进相结合,这正是我所需要的。感谢您和Ed Morton检查
delete array
现在是POSIX。
awk -F':|\n' -v RS=  '{delete a; for (i=1;i<=NF;i+=2) {a[$i]=$(i+1);} if (a["Age"]+0>40) print a["Name"];}' file
for (k in a) delete a[k];