파이프와 대괄호로 구분된 Bash 스크립트 배열

파이프와 대괄호로 구분된 Bash 스크립트 배열

|로 구분된 텍스트 파일 내용을 변환하려면 bash 스크립트를 만들어야 합니다. 그리고] ...

다음과 같은 텍스트 파일 콘텐츠:

Col1|Col2|Col3|P1]P2]P3|D1]D2]D3||Col4 
Col3|ColA|ColA|PA]PB]|DA]DB]|ColD||

원하는 출력은 다음과 같습니다.

Col1 Col2 Col3 P1 D1 0 Col4
Col1 Col2 Col3 P2 D2 0 Col4
Col1 Col2 Col3 P3 D3 0 Col4
Col3 ColA ColA PA DA ColD 0
Col3 ColA ColA PB DB ColD 0
Col3 ColA ColA 0 0 ColD 0

편집: ] 뒤의 빈 열과 빈 데이터는 모두 0으로 대체됩니다.

감사해요.

답변1

샘플 스크립트를 통해 수행할 수 있습니다(내 스크립트는 최적은 아니지만 작동함).

awk -F'[]|]' '{
   print $1,$2,$3,$4,$7,$10
   print $1,$2,$3,$5,$8,$10
   print $1,$2,$3,$6,$9,$10 }' input_filename

또는

awk -F'[]|]' '{
   for (i = 4; i <= 6; i++)
     print $1,$2,$3,$i,$(i+3),$10}' input_filename

당신은 변경할 수 있습니다출력 필드 구분 기호(기본값은 공백) -v OFS=','.

작업을 수행하는 보다 유연한 방법(내부 필드 분리)을 제공한 @steeldriver에게 감사드립니다.

awk -F'|' '{
  split($3,a,/]/); n = split($4,b,/]/); 
  for(i=1;i<=n;i++) print $1,$2,a[1],a[i+1],b[i],$5}' input_filename

편집된 질문에 따르면 빈 필드를 (0)으로 바꾸려면 0다음과 같은 스크립트를 사용하여 수행할 수 있습니다.

awk -F'[]|]' '{ 
   for (i = 1; i <= 11; i++) if ($i == "") $i=0}
   {
   print $1,$2,$3,$4,$7,$10,$11
   print $1,$2,$3,$5,$8,$10,$11
   print $1,$2,$3,$6,$9,$10,$11 }' input_filename

귀하의 의견에 따르면 스크립트는 다음과 같습니다.

awk -F'|' -v OFS="\t" '{
 n = split($4,D,"]"); split($5,E,"]");
 for (i = 1; i <= n; i++) {
     if (D[i] == "") D[i]=0;
     if (E[i] == "") E[i]=0;}
     print $1,$2,$3,D[i],E[i],$6,$7 }' input_file 

답변2

awk문제를 다시 살펴보면 다음과 같습니다.

awk -F'|' '
  {
    n = split($4, f4, "]")
        split($3, f3, "]")
    for (i = 1; i <= n; i++) {
      $3 = f3[1] OFS f3[1+i]
      $4 = f4[i]
      print
    }
  }'

관련 정보