가변 개수의 문자열을 사용하여 특정 열의 내용 분할

가변 개수의 문자열을 사용하여 특정 열의 내용 분할

새 줄의 두 번째 열에 있는 각 "단어"를 인쇄하고 각 새 줄의 첫 번째 열에 있는 텍스트를 복사해야 합니다. 열은 탭으로 구분되며 두 번째 열의 모든 "단어"는 "GO:"로 시작하고 공백으로 구분됩니다. 또한 각 줄에는 1개에서 수십 개까지 다양한 "단어" 수가 있습니다.

예를 들어

TRINITY_DN23871_c0_g1_i1   GO:0003735 GO:0005783 GO:0005829  
TRINITY_DN6318_c1_g1_i1    GO:0004707 GO:0005524

원하는 출력

TRINITY_DN23871_c0_g1_i1   GO:0003735
TRINITY_DN23871_c0_g1_i1   GO:0005783
TRINITY_DN23871_c0_g1_i1   GO:0005829
TRINITY_DN6318_c1_g1_i1    GO:0004707
TRINITY_DN6318_c1_g1_i1    GO:0005524

나는 awk를 사용해 보았습니다.

awk -v RS=" " '{print}' unique.ID_all.unique.GOs2

하지만 내가 얻는 것은

TRINITY_DN23871_c0_g1_i1
GO:0003735
GO:0005783
GO:0005829
TRINITY_DN6318_c1_g1_i1
GO:0004707
GO:0005524

아이디어가 부족해요. 누구든지 도와줄 수 있나요?

답변1

2부터 필드 수( NF)까지 반복하고 첫 번째 필드와 다른 필드를 탭으로 구분하여 인쇄할 수 있습니다.

awk '{ for (i=2;i<=NF;i++) print $1"\t"$i }' unique.ID_all.unique.GOs2

답변2

밀러 사용(https://github.com/johnkerl/miller), 다음부터 시작

TRINITY_DN23871_c0_g1_i1    GO:0003735  GO:0005783  GO:0005829  
TRINITY_DN6318_c1_g1_i1 GO:0004707  GO:0005524

그리고 달리는 중

mlr --nidx --fs tab then reshape -r "^[^1]" -o item,value then cut -x -f item input.tsv >output.tsv

당신은 할 것

TRINITY_DN23871_c0_g1_i1        GO:0003735
TRINITY_DN23871_c0_g1_i1        GO:0005783
TRINITY_DN23871_c0_g1_i1        GO:0005829
TRINITY_DN23871_c0_g1_i1
TRINITY_DN6318_c1_g1_i1 GO:0004707
TRINITY_DN6318_c1_g1_i1 GO:0005524

이 명령에 대한 몇 가지 참고 사항:

  • --nidx --fs tab,입력 및 출력 형식 설정
  • reshape -r "^[^1]" -o item,value, 입력 파일을 와이드 형식에서 긴 형식으로 변환합니다.
  • cut -x -f item출력 열 선택

관련 정보