목록은 첫 번째 필드를 기준으로 정렬됩니다. 첫 번째 필드가 동일한 행에 두 번째 필드를 추가하는 방법은 무엇입니까?

목록은 첫 번째 필드를 기준으로 정렬됩니다. 첫 번째 필드가 동일한 행에 두 번째 필드를 추가하는 방법은 무엇입니까?

두 개의 필드가 있는 여러 목록이 있습니다. 첫 번째 필드에는 URL이 포함되고 두 번째 필드에는 이메일 주소(계정)가 포함됩니다. 두 번째 필드는 목록의 모든 항목에 대해 동일합니다.

이 목록을 하나의 목록으로 연결하고 첫 번째 필드를 기준으로 정렬합니다. 대부분의 항목은 고유하지만 일부 항목은 중복되거나 3중 항목입니다(예: URL이 여러 계정 목록에 있음).

필요할 때 두 번째 필드가 계정 목록이 되도록 중복 항목을 결합하는 데 사용할 수 있는 명령이나 스크립트가 있습니까?

예를 들어:

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두 번째 필드의 쉼표로 구분된 값 목록

다음을 사용하여 쉼표를 공백으로 변환할 수 있습니다 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 ',' ' '

관련 정보