![列表按第一个字段排序,如何在第一个字段相同的行上加入第二个字段?](https://linux22.com/image/165560/%E5%88%97%E8%A1%A8%E6%8C%89%E7%AC%AC%E4%B8%80%E4%B8%AA%E5%AD%97%E6%AE%B5%E6%8E%92%E5%BA%8F%EF%BC%8C%E5%A6%82%E4%BD%95%E5%9C%A8%E7%AC%AC%E4%B8%80%E4%B8%AA%E5%AD%97%E6%AE%B5%E7%9B%B8%E5%90%8C%E7%9A%84%E8%A1%8C%E4%B8%8A%E5%8A%A0%E5%85%A5%E7%AC%AC%E4%BA%8C%E4%B8%AA%E5%AD%97%E6%AE%B5%EF%BC%9F.png)
我有几个包含两个字段的列表 - 第一个字段包含 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 ',' ' '