リストは最初のフィールドに基づいてソートされます。最初のフィールドが同じ行に2番目のフィールドを追加する方法は?

リストは最初のフィールドに基づいてソートされます。最初のフィールドが同じ行に2番目のフィールドを追加する方法は?

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 22番目のフィールドのカンマ区切り値のリスト

以下を使用してコンマをスペースに変換できます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 ',' ' '

関連情報