2つのフィールドを持つ複数のリストがあります。最初のフィールドにはURLが含まれ、2番目のフィールドにはEメールアドレス(アカウント)が含まれています。 2番目のフィールドは、リスト内のすべての項目について同じです。
このリストを1つのリストにリンクし、最初のフィールドに基づいてソートします。ほとんどのアイテムは一意ですが、一部のアイテムは重複またはトリプルアイテムです(たとえば、URLは複数のアカウントのリストにあります)。
必要に応じて2番目のフィールドがアカウントリストになるように重複エントリを結合するために使用できるコマンドまたはスクリプトはありますか?
たとえば、 URL 1 アカウント 2 URL2アカウント1 url3アカウント1 url3アカウント2 url4アカウント2 url4アカウント3 url4アカウント5 ... 次のようにする必要があります。 URL 1 アカウント 2 URL2アカウント1 url3アカウント1アカウント2 url4アカウント2アカウント3アカウント5 ...
答え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
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 ',' ' '