두 개의 구분 기호로 데이터를 구문 분석하려고 합니다.

두 개의 구분 기호로 데이터를 구문 분석하려고 합니다.

그래서 제가 하려는 작업은 다음과 같습니다. 샘플 CSV 보기:

1,3917,3917,BGP=694|Ethernet=1610|LAG=3,Y

스크립트를 실행한 후 출력은 다음과 유사해야 합니다.

1,3917,3917,BGP=694,Y
1,3917,3917,Ethernet=1610,Y
1,3917,3917,LAG=3,Y

추가 구분 기호가 있는 원본 CSV 파일의 한 행은 이제 4번째 열에 3개의 추가 필드가 있으므로 3개 행으로 변환됩니다.

나는 하루 종일 이것에 대해 연구해왔고 이것이 내가 생각해낸 것입니다. 작동할까요?

암호:

 #!/usr/bin/ksh
   if [ $# -ne 1 ];
     then echo "Usage: read.sh filename";
     exit 1;
    fi
   file="$1"
   while read line
     do
       IFS='|'
       set x $line
       while [ a -le #$]
         do
           a=a+1
           echo "`$1`,`$a`"
         done
     done < $1

답변1

대신 AWK를 사용하세요

이 문제는 AWK를 사용하면 훨씬 쉽게 해결할 수 있습니다. 나는 이것을 GNU AWK로 테스트했습니다. 다른 것을 사용한다면 약간 조정해야 할 수도 있습니다.

#!/usr/bin/gawk -f

BEGIN { FS = "|" }

{
  split( $3, array, /,/ )
  print $1 "," array[2]
  print $1 "," $2 "," array[2]
  print $1 "," $3
}

스크립트를 어딘가에 저장하세요(예:파싱.awk) 실행 가능한지 확인하세요. 그런 다음 CSV 파일이나 표준 입력에서 스크립트를 호출하고 다음과 같은 결과를 수집할 수 있습니다.

$ echo '1,3917,3917,BGP=694|Ethernet=1610|LAG=3,Y' | parse.awk
1,3917,3917,BGP=694,Y
1,3917,3917,BGP=694,Ethernet=1610,Y
1,3917,3917,BGP=694,LAG=3,Y

답변2

당신이 가지고 있는 것은 파이프 기호로 구분된 그룹화된 값을 포함하는 필드인 것 같습니다.

당신은 그것을 사용할 수 있습니다밀러( mlr) 이러한 그룹화된 값을 별도의 새 레코드로 "폭발"합니다.

$ mlr --csv -N nest --evar pipe -f 4 file
1,3917,3917,BGP=694,Y
1,3917,3917,Ethernet=1610,Y
1,3917,3917,LAG=3,Y

file이는 헤더 없는 CSV 파일에서 입력을 읽은 다음 nest네 번째 필드의 파이프로 구분된 하위 필드를 새 레코드로 나누는 작업을 적용합니다.

반대의 작업을 수행할 수도 있습니다. 즉, 네 번째 필드의 값을 파이프로 구분된 결합된 필드로 "내포"할 수도 있습니다.

$ cat file
1,3917,3917,BGP=694,Y
1,3917,3917,Ethernet=1610,Y
1,3917,3917,LAG=3,Y
$ mlr --csv -N nest --ivar pipe -f 4 file
1,3917,3917,BGP=694|Ethernet=1610|LAG=3,Y

Miller는 CSV를 지원하기 때문에 쉼표나 줄 바꿈이 포함된 필드가 포함된 데이터에는 문제가 발생하지 않습니다.

관련 정보