列表按第一个字段排序,如何在第一个字段相同的行上加入第二个字段?

列表按第一个字段排序,如何在第一个字段相同的行上加入第二个字段?

我有几个包含两个字段的列表 - 第一个字段包含 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 ',' ' '

相关内容