여러 줄을 하나로 합치기

여러 줄을 하나로 합치기

파일이 있어요

Gene stable GO_ID
AAEL025769 AAEL025769-RA GO:0005525
AAEL020629 AAEL020629-RA GO:0003677
AAEL020629 AAEL020629-RA GO:0005634
AAEL020629 AAEL020629-RA GO:0000786
AAEL020629 AAEL020629-RA GO:0046982
AAEL011255 AAEL011255-RA GO:0005525
AAEL000004 AAEL000004-RA GO:0016021
AAEL000004 AAEL000004-RA GO:0016757
AAEL000004 AAEL000004-RA GO:0005789
AAEL000004 AAEL000004-RA GO:0006506
AAEL000004 AAEL000004-RA GO:0000030
AAEL003589 AAEL003589-RA NA
AAEL026354 AAEL026354-RA NA

일부 유전자의 경우 여러 GO-ID가 있습니다(예: 위 예의 AAEL020629 및 AAEL000004). 각 유전자에 대해 여러 개의 GO_ID가 있는 경우 이를 모두 한 줄에 결합하고 싶습니다(쉼표와 공백으로 구분).

아래는 내가 원하는 출력입니다.

Gene    GO_ID
AAEL025769      GO:0005525
AEL020629       GO:0003677, GO:0005634, GO:0000786, GO:0046982
AAEL011255      GO:0005525
AAEL000004      GO:0016021, GO:0016757, GO:0005789, GO:0006506, GO:0000030
AAEL003589      NA
AAEL026354      NA

어떻게 할 수 있는지 아시나요? 감사해요

답변1

그리고밀러

$ mlr --pprint nest --implode --values --across-records --nested-fs ', ' -f GO_ID then cut -x -f stable file 
Gene       GO_ID
AAEL025769 GO:0005525
AAEL020629 GO:0003677, GO:0005634, GO:0000786, GO:0046982
AAEL011255 GO:0005525
AAEL000004 GO:0016021, GO:0016757, GO:0005789, GO:0006506, GO:0000030
AAEL003589 NA
AAEL026354 NA

또는 (약간 더 간단하지만 출력에 대한 제어력이 떨어짐)GNU 데이터 통합

$ datamash -HW groupby Gene collapse GO_ID < file
GroupBy(Gene)   collapse(GO_ID)
AAEL025769  GO:0005525
AAEL020629  GO:0003677,GO:0005634,GO:0000786,GO:0046982
AAEL011255  GO:0005525
AAEL000004  GO:0016021,GO:0016757,GO:0005789,GO:0006506,GO:0000030
AAEL003589  NA
AAEL026354  NA

답변2

awk가 도움이 될 수 있습니다:

$ awk '{ a[$1]=a[$1]", "$3; }
END { for (i in a) { sub(/,/,"",a[i]);printf "%s %s\n",i,a[i] } }
' file
Gene  GO_ID
AAEL003589  NA
AAEL025769  GO:0005525
AAEL026354  NA
AAEL000004  GO:0016021, GO:0016757, GO:0005789, GO:0006506, GO:0000030
AAEL020629  GO:0003677, GO:0005634, GO:0000786, GO:0046982
AAEL011255  GO:0005525

관련 정보