CSV 파일 재구성

CSV 파일 재구성

수정하려는 데이터의 예는 다음과 같습니다.

John,,
bim,bam,boom
tim,tam,toom
lam,loom,lim
Mary,,
pam,pim,poom
dam,dim,doom*

나는 이것을 달성하려고 노력합니다.

John,bim,bam,boom
John,tim,tam,toom
John,lam,loom,lim
Mary,pam,pim,poom
Mary,dam,dim,doom

이름이 행에 단독으로 나타나면 다음 이름이 동일한 패턴으로 나타날 때까지 그 아래의 모든 행에 대해 새 열이 됩니다.

awk나 다른 도구가 도움이 될 수 있을지 궁금합니다. 하지만 조금 당황스럽습니다.

조건을 설정해 보았지만(2열과 3열이 비어 있으면 뭔가 수행) 지금은 조금 복잡해 보입니다.

답변1

당신의 생각은 정확합니다:

조건을 설정해 봅니다(2열과 3열이 비어 있으면 뭔가를 하세요)

구체적으로,

  • 2열과 3열이 비어 있으면 1열의 값을 저장하고 계속 진행합니다.
  • 그렇지 않으면, 저장된 값을 라인에 추가하고 인쇄하십시오( awk이를 수행하는 방법에는 여러 가지가 있습니다).

예를 들어

awk -F, '$2=="" && $3=="" {pfx=$1; next} {print pfx "," $0}' file.csv

또는 더 관용적으로 FS필드 구분 변수를 사용하십시오.

awk -F, '$2=="" && $3=="" {pfx=$1; next} {$0 = pfx FS $0; print}' file.csv

또는 (기본 작업 - 규칙이 true로 평가되거나 1- 레코드를 인쇄하는 것이기 때문에)

awk -F, '$2=="" && $3=="" {pfx=$1; next} {$0 = pfx FS $0} 1' file.csv
John,bim,bam,boom
John,tim,tam,toom
John,lam,loom,lim
Mary,pam,pim,poom
Mary,dam,dim,doom

답변2

펄 대안:

$ perl -F',' -lane 'if(@F == 1){$prefix = sprintf("%s,",@F);next;};print $prefix . $_' input.csv
John,bim,bam,boom
John,tim,tam,toom
John,lam,loom,lim
Mary,pam,pim,poom
Mary,dam,dim,doom

이 작업의 전제는 as 연산자를 사용하여 각 행을 요소 배열로 분할하고 ,, 배열에 항목이 하나만 있는 경우 해당 행을 접두어로 사용하고 다음 행으로 이동한다는 것입니다. 요소 1개보다 긴 다른 줄에는 접두사가 추가됩니다. 물론 배열 길이가 1인 경우에만 접두사가 변경됩니다.

shift또는 Glenn Jackman이 제안한 것처럼 더 짧게 설명하면 다음과 같습니다.

$ perl -F',' -lane 'if(@F == 1){$prefix = shift @F;next;};print $prefix . "," . $_' input.csv       

또는

$ perl -F, -lane '$,=","; if (1 == @F) {$name = shift @F} else {print $name, @F}' input.csv

관련 정보