다음 형식의 두 열이 있는 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
작업은 mlr
options 를 통해 평가됩니다 --evar , -f 2
. 이는 "필드 2의 쉼표로 구분된 하위 필드("중첩 필드")를 새 레코드로 분해"를 의미합니다.
답변3
두 번째 토큰에 awk
with 함수를 사용할 수 있습니다 .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에서 작동하는지 확인합니다.