Awk
按第一個欄位排序的列表,如何在第一個欄位相同的行上加入第二個欄位?
我有幾個包含兩個欄位的列表 - 第一個欄位包含一個 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 ',' ' '