现在我有几个不同的清单,我会尽力解释一下。
列表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的高级用法,但坦率地说,这样的事情超出了我的想象。任何正确方向的帮助/点都会非常感激!
答案 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