Awk

按第一個欄位排序的列表,如何在第一個欄位相同的行上加入第二個欄位?

  • December 13, 2019

我有幾個包含兩個欄位的列表 - 第一個欄位包含一個 URL,第二個欄位包含一個電子郵件地址(一個帳戶)。對於列表中的所有條目,第二個欄位是相同的。

我將列表連接到一個列表,並按第一個欄位對其進行排序。大多數條目是唯一的,但有些條目是重複的或一式三份的(即 URL 在多個帳戶的列表中)。

是否有可用於加入重複項的命令或腳本,因此第二個欄位在需要時成為帳戶列表?

例如:

網址 1 帳戶 2
網址 2 帳戶 1
url3 賬戶 1
url3 帳戶 2
url4 帳戶 2
url4 賬戶 3
url4 帳戶 5
...

應該變成:

網址 1 帳戶 2
網址 2 帳戶 1
url3 賬戶 1 賬戶 2
url4 賬戶 2 賬戶 3 賬戶 5
...

使用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

使用 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 ',' ' '

引用自:https://unix.stackexchange.com/questions/557004