이것은 내 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
- 필드 번호를 기준으로 분해합니다. 삼