테이블의 행을 열로 변환

테이블의 행을 열로 변환

이것은 내 1.file입니다(구분 기호는 "\t"입니다).

 ot1     a       a,b,c,d,e
 ot2     b       b,c,q
 ot3     c       c,f,g
 ot4     e       a,g,e

2.file을 가져오고 싶습니다(구분 기호는 "\t"입니다).

 ot1     a       a
 ot1     a       b
 ot1     a       c
 ot1     a       d
 ot1     a       e
 ot2     b       b
 ot2     b       c
 ot2     b       q
 ot3     c       c
 ot3     c       f
 ot3     c       g
 ot4     e       a
 ot4     e       g
 ot4     e       e

먼저 "sed -i "s/,/\n/g"를 시도했지만 다음에 무엇을 해야할지 모르겠습니다. 도움을 주셔서 감사합니다.

답변1

다음과 같은 작업이 수행됩니다.

awk -F\\t 'BEGIN {OFS=FS} {n=split($3,aa,",");for (i=1;i<=n;i++) {$3=aa[i]; printf "%s\n" $0 }}' 

첫 번째 탭 구분 기호에는 이중 이스케이프가 필요합니다.

그런 다음 세 번째 태그를 분할하고 분할 배열의 요소 수를 가져옵니다.

그런 다음 루프의 세 번째 태그를 분할 요소로 바꾸고 인쇄합니다.

답변2

밀러는 여기서 일할 것입니다:

mlr --tsv -N nest --explode --values --across-records --nested-fs "," -f 3 1.file > 2.file

설명하다

--tsv- 입력 및 출력에 탭으로 구분된 값 파일 형식을 사용합니다.

-N- 헤더 이름 대신 숫자 ID를 사용하여 필드 주소 지정

nest- 데이터가 중첩되어 있습니다.

--explode- 중첩된 데이터 분해

--values- 중첩된 데이터는 별도의 값입니다.

--across-records- 분해된 데이터를 별도의 레코드에 기록

--nested-fs- 중첩된 값에 대한 필드 구분 기호

-f 3- 필드 번호를 기준으로 분해합니다. 삼

관련 정보