TSV에서 CSV로 열 분할

TSV에서 CSV로 열 분할

다음 형식의 두 열이 있는 TSV 파일이 있습니다.

id1\tcol1,col2,col3
id2\tcol4,col5

두 번째 열을 첫 번째 열과 결합하여 출력하고 싶습니다.

id1,col1
id1,col2
id1,col3
id2,col4
id2,col5

두 가지 질문이 있습니다:

  • TSV의 두 번째 열에 쉼표로 구분된 값의 고정되지 않은 개수
  • 파일이 너무 커서 메모리에 로드할 수 없습니다.

쉼표로 구분된 값은 깨끗하고 가 없으므로 둘러싸기를 사용하지 ,않습니다 . "그래서 우리는 쉼표마다 나누었습니다.

답변1

awk를 사용하십시오.

$ awk -F'[\t,]' -v OFS=',' '{for (i=2; i<=NF; i++) print $1, $i}' file
id1,col1
id1,col2
id1,col3
id2,col4
id2,col5

위의 내용은 첫 번째 열에 ,을 포함할 수 없고 두 번째 열에 탭을 포함할 수 없다고 가정합니다. 둘 다 데이터 형식에 대한 질문의 예제와 설명에서 올바른 것처럼 보이므로 데이터에 적합해야 합니다.

답변2

$ mlr --t2c -N nest --evar , -f 2 file
id1,col1
id1,col2
id1,col3
id2,col4
id2,col5

이는 다음을 사용합니다.밀러( mlr)는 탭으로 구분된 헤더 없는 필드로 구성된 레코드를 읽고 헤더 없는 CSV를 작성합니다.

각 레코드(행)에 대해 nest작업은 mlroptions 를 통해 평가됩니다 --evar , -f 2. 이는 "필드 2의 쉼표로 구분된 하위 필드("중첩 필드")를 새 레코드로 분해"를 의미합니다.

답변3

두 번째 토큰에 awkwith 함수를 사용할 수 있습니다 .split

awk  'BEGIN {OFS=","} {n=split($2,a,",");  for(i=1;i<=n;i++) print $1,a[i]} ' input_file

답변4

Python을 사용하려는 경우 이는 매우 간단해 보입니다.

#!/usr/bin/env python

from __future__ import print_function
import sys

with open(sys.argv[1]) as f:
    for line in f:
        key, vals = line.strip().split('\t')
        for val in vals.split(','):
            print(key, val, sep=',')

from __future__줄은 Python2 및 3에서 작동하는지 확인합니다.

관련 정보