我有几个包含两个字段的列表 - 第一个字段包含 URL,第二个字段包含电子邮件地址(帐户)。第二个字段对于列表中的所有条目都是相同的。
我将这些列表连接到一个列表,并按第一个字段对其进行排序。大多数条目都是唯一的,但有些条目是重复的或一式三份的(即 URL 位于多个帐户的列表中)。
是否有命令或脚本可用于加入重复项,以便第二个字段在需要时成为帐户列表?
例如: 网址1 帐户2 url2 帐户1 url3 帐户1 url3 帐户2 url4 帐户2 url4 帐户3 url4 帐户5 ... 应该变成: 网址1 帐户2 url2 帐户1 url3 acct1 acct2 url4 acct2 acct3 acct5 ...
答案1
带sort
+awk
管道:
sort -k1,1 file \
| awk 'url && $1 != url{ print url, acc }
{ acc = ($1 == url? acc FS:"") $2; url = $1 }END{ print url, acc }' OFS='\t'
示例输出:
url1 acct2
url2 acct1
url3 acct1 acct2
url4 acct2 acct3 acct5
答案2
使用 GNU datamash
:
$ datamash -W -g 1 collapse 2 < input.txt
url1 acct2
url2 acct1
url3 acct1,acct2
url4 acct2,acct3,acct5
选项:
-W
使用空格/制表符作为字段分隔符-g 1
第一个字段上的组collapse 2
第二个字段的逗号分隔值列表
您可以使用以下命令将逗号转换为空格tr
:
$ datamash -W -g 1 collapse 2 < input.txt | tr ',' ' '
url1 acct2
url2 acct1
url3 acct1 acct2
url4 acct2 acct3 acct5
如果您需要对第一个字段的输出进行排序,请添加-s
:
datamash -s -W -g 1 collapse 2 < input.txt | tr ',' ' '