두 개의 필드가 있는 여러 목록이 있습니다. 첫 번째 필드에는 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 ',' ' '