如何在awk中连接字符串,过滤掉重复的单词?

时间:2014-02-28 00:36:47

标签: arrays unix scripting awk gawk

我有一个

形式的文本文件
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

2 个答案:

答案 0 :(得分:2)

此解决方案将删除每个餐厅输出中的重复名称:

script.awk的内容

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