我有一个
形式的文本文件name1,name2,name3.....namen;restaurant.
我创建了一个数组,其中的键是文件中所有唯一的餐厅。 我创建了第二个数组,其中键是所有名称,值是餐馆名称。 我遍历第二个数组,并将第二个数组中每个存储桶的密钥与第一个数组中的存储桶连接,第一个数组中的存储桶的密钥与第二个数组中的值匹配。如何使连接忽略当前已存在于存储桶中的名称?
实施例
Yan,Arnita,Rosetta,Ambrose,Jammie,Seth,Marilu; Tamarind
Myrtie,Michal,Vanesa,Louanne,Frederick,Patsy;Maxie's Supper Club
Zulma,Avril,Leisha,Jammie,Seth,Marilu;Tamarind
到
Tamarind : Zulma Avril Leisha Jammie Seth Marilu Yan Arnita Rosetta Ambrose
Maxie’s Supper Club: Myrtie Michal Vanesa Louanne Frederick Patsy
答案 0 :(得分:2)
此解决方案将删除每个餐厅输出中的重复名称:
BEGIN {FS="[,;]"}
{
for(x = 1; x < NF; x++) {
!tmp[$NF,$x]++ &&
names[$NF] = (names[$NF]) ? names[$NF]" "$x : $x
}
}
END {
for (x in names) print x": "names[x]
}
$ cat file
Yan,Arnita,Rosetta,Ambrose,Jammie,Seth,Marilu;Tamarind
Myrtie,Michal,Vanesa,Louanne,Frederick,Patsy;Maxie's Supper Club
Zulma,Avril,Leisha,Jammie,Seth,Marilu;Tamarind
$ awk -f script.awk file
Maxie's Supper Club: Myrtie Michal Vanesa Louanne Frederick Patsy
Tamarind: Yan Arnita Rosetta Ambrose Jammie Seth Marilu Zulma Avril Leisha
答案 1 :(得分:1)
假设您不关心排序顺序,这是使用gawk
的一种方式。我们使用多维数组。像:
gawk -f ./script.awk file
script.awk
的内容:
BEGIN {
FS="[,;]"
}
{
sub(/^ */,"",$NF)
for (i=1;i<NF;i++) {
a[$NF][$i]
}
}
END {
for (i in a) {
for (j in a[i]) {
r = (r ? r : i ":") OFS j
}
print r
r=""
}
}
结果:
Tamarind: Rosetta Avril Seth Ambrose Yan Marilu Arnita Leisha Zulma Jammie
Maxie's Supper Club: Myrtie Louanne Patsy Michal Frederick Vanesa