删除重复的用户名,并组合重复列

时间:2015-03-03 20:53:22

标签: bash awk

现在我有几个不同的清单,我会尽力解释一下。

列表1如下所示:

user1,host1:port1
user2,host2:port2
user1,host3:port3

我针对用户名对数据库进行查找并返回以下内容:

user1   email1
user2   email2
user1   email1

在我的示例中,两个文件都有重复的用户和电子邮件。但是,主机和端口可能都不同。获得如下输出的最有效方法是什么:

user1   email1    host1:port1, host3:port3
user2   email2    host2:port2

我假设使用了awk的高级用法,但坦率地说,这样的事情超出了我的想象。任何正确方向的帮助/点都会非常感激!

2 个答案:

答案 0 :(得分:0)

$ cat file1
user1,host1:port1
user2,host2:port2
user1,host3:port3

$ cat file2
user1   email1
user2   email2
user1   email1

$ cat tst.awk                
BEGIN{ FS="[[:space:],]+" }
NR==FNR { user2hosts[$1][$2]; next }
{ user2email[$1] = $2 }
END {
   for (user in user2email) {
       printf "%s\t%s\t", user, user2email[user]
       sep = ""
       for (host in user2hosts[user]) {
           printf "%s%s", sep, host
           sep = ", "
       }
       print ""
   }
}

$ gawk -f tst.awk file1 file2
user1   email1  host1:port1, host3:port3
user2   email2  host2:port2

以上使用GNU awk 4. *表示2D数组。

答案 1 :(得分:0)

使用此awk:

awk -F '[, ]+' 'FNR==NR {a[$1]=$0; next}
$1 in a {
   if (!seen[a[$1]])
      seen[a[$1]] = $2;
   else
      seen[a[$1]] = seen[a[$1]] ", " $2
}
END { for (i in seen) print i, seen[i]}' list2 list1
user2   email2 host2:port2
user1   email1 host1:port1, host3:port3