공유된 일치 열을 행으로 변환

공유된 일치 열을 행으로 변환

다음과 같은 구조의 파일이 있습니다.

Locus7625186 GO0004866
Locus7625186 GO0010951
Locus7625186 GO0005615
Locus7625186 GO0016021
Locus7360093 GO0004712
Locus7360093 GO0007093
Locus1507198 GO0044212
Locus1507198 GO0045944
Locus1507198 GO0005634
Locus1507198 GO0036464
Locus1507198 GO0046982

이것을 다음과 같이 변환해야 합니다.

Locus7625186 GO0004866 GO0010951 GO0005615 GO0016021
Locus7360093 GO0004712 GO0007093
Locus1507198 GO0044212 GO0045944 GO0005634 GO0036464 GO0046982

GOxxxxxxx동일한 첫 번째 열을 공유하는 일치 항목 수는 다양합니다.

답변1

그리고GNU 데이터 통합

$ datamash -W groupby 1 collapse 2 < file | sed 's/,/ /g'
Locus7625186    GO0004866 GO0010951 GO0005615 GO0016021
Locus7360093    GO0004712 GO0007093
Locus1507198    GO0044212 GO0045944 GO0005634 GO0036464 GO0046982

(기본 쉼표 구분 기호가 마음에 들지 않으면 sed에서 파이프를 생략할 수 있습니다).

답변2

GNU sed스트림 편집기를 사용하여 이 문제를 해결할 수 있습니다.

sed -Ee '
   :a
      $!N
      s/^((\S+)\s.*)\n\2(\s.*)/\1\3/
   ta
   P;D
' file

결과

Locus7625186 GO0004866 GO0010951 GO0005615 GO0016021
Locus7360093 GO0004712 GO0007093
Locus1507198 GO0044212 GO0045944 GO0005634 GO0036464 GO0046982

이는 다음을 사용하여 수행할 수도 있습니다 POSIX sed.

sed -e '
   :a
      $!N
      s/^\(\([^[:space:]]\{1,\}\)[[:space:]].*\)\n\2\([[:space:]].*\)/\1\3/
   ta
   P;D
' file

답변3

sed작고 휴대 가능하며 이상한 또 다른 접근 방식은 다음과 같습니다.

sed 'N;/^\(.*\)\( .*\)\(\n\1\)/!P;s//\3\2/;D'
  • N;P;D방법을 사용하여 패턴 공간에 항상 두 줄을 가지므로 N다음 줄을 먼저 추가합니다 .
  • /^\(.*\) .*\n\1/단어, 공백, 다른 단어, 개행 문자 및 반복되는 초기 단어로 시작하는 줄을 일치시키므로 버퍼의 두 줄이 첫 번째( Locus) 단어를 공유합니다. 그렇지 않은 경우( !) P첫 번째 줄은 완료된 것으로 인쇄되며 나중에 다음을 사용하여 삭제할 수 있습니다.D
  • 그러나 줄이 일치하면 첫 번째 단어가 동일한 두 줄이 있고 개행과 중복 단어를 제거하여 교체를 수행할 수 있습니다. 그래서 주소 패턴에 두 개의 하위 그룹을 추가했기 때문에 P이제는 반복하지 않고 빈 패턴을 사용하여 재사용합니다.
  • 이제 트릭이 나옵니다. 패턴 공간에 빈 첫 번째 줄이 있고 그 뒤에는 첫 번째 단어와 지금까지 가지고 있는 모든 두 번째 단어가 포함된 두 번째 줄이 first second\nfirst있도록 대체합니다. \nfirst second이제 다음은 D비어 있는 첫 번째 행을 제거하고 지금까지 수집된 행을 계속 사용합니다. 이를 일치 항목에 포함하면 교체할 필요가 없으므로 \n이식성 이 없습니다.\3\n

답변4

awk '!a[$1]{b[++p]=$1; a[$1]=$2;next} {a[$1]=sprintf("%s%s%s", a[$1], OFS, $2)} END {for (i=1; i<=p; i++) print b[i], a[b[i]]}' file

이 기사를 바탕으로첫 번째 필드/요소를 기준으로 행을 그룹화하는 방법

관련 정보