피벗 파일 값

피벗 파일 값

첫 번째 열이 키인 파일이 있습니다. 줄에는 최대 2800개의 구분 기호가 포함될 수 있습니다. 데이터를 행에서 열로 변환해야 합니다. 다음은 샘플 입력과 원하는 출력입니다.

소스 파일

123,A,B,,,,AC,DF,,,,,,,,,,,,n 
567,A,B,,C,D,,,,,,,,, 7
89,C,B

산출

123,A
123,B
123,
123,
.
.
123,AC
123,DF
567,A
567,B
567,C
567,D
567,7
89,C
89,B

조언해주세요.

답변1

밀러 사용(http://johnkerl.org/miller/doc/) 그리고

mlr --nidx --fs "," reshape -r '[^1]' -o item,value \
then filter -S -x '$value==""' \
then cut -f 1,value input.txt

당신은

123,A
123,B
123,AC
123,DF
123,n
567,A
567,B
567,C
567,D
567, 7
89,C
89,B

null 값도 원하면 다음과 같습니다.

mlr --nidx --fs "," reshape -r '[^1]' -o item,value \
then cut -f 1,value input.txt

당신은 할 것

123,A
123,B
123,
123,
123,
123,AC
123,DF
123,
123,
123,
123,
123,
123,
123,
123,
123,
123,
123,n
567,A
567,B
567,
567,C
567,D
567,
567,
567,
567,
567,
567,
567,
567, 7
89,C
89,B

답변2

$ cat file
123,A,B,,,,AC,DF,,,,,,,,,,,,n
567,A,B,,C,D,,,,,,,,, 7
89,C,B
$ awk -F, 'BEGIN { OFS = FS } { for (i = 2; i <= NF; ++i) if ($i != "") print $1, $i }' file
123,A
123,B
123,AC
123,DF
123,n
567,A
567,B
567,C
567,D
567, 7
89,C
89,B

이는 데이터가 다음 위치에 있다고 가정합니다.단순한따옴표가 필요하지 않은 CSV 형식입니다(모든 필드에 쉼표나 줄 바꿈이 포함되지 않음). 코드 awk는 단순히 필드 2로 시작하는 각 줄의 쉼표로 구분된 필드를 반복하고 새 줄의 첫 번째 필드와 함께 인쇄합니다. 빈 필드는 무시됩니다. 빈 필드를 무시하지 않으려면(질문에서 명확하지 않음) if ($i != "")코드에서 해당 비트를 제거하십시오.

관련 정보