두 번째 열의 구분 기호를 기준으로 CSV 파일의 단일 행을 여러 행으로 분할하는 방법

두 번째 열의 구분 기호를 기준으로 CSV 파일의 단일 행을 여러 행으로 분할하는 방법

내 base.csv 파일에는 여러 항목이 있습니다. 아래는 그 중 하나의 예입니다.

NAME,IP_ADDRESS,PRI_IP,APP_CODE,APP_NAME,OWNER
test2,10.9.7.12/10.222.101.11,10.9.9.12,545,myapp1,owner1
mytest,10.9.7.12,10.9.9.12,545,myapp1,owner9
checkthis,10.9.7.12/10.222.101.11/10.3.2.111,10.9.9.12,545,myapp1,owner7

참고: 두 번째 열은 항상 구분 기호로 구분된 하나 이상의 IP 주소입니다./

생성된 두 번째 열에는 항상 하나의 IP만 있기를 원합니다 newbase.csv.

따라서 필요한 newbase.csv는 다음과 같습니다.

test2,10.9.7.12,10.9.9.12,545,myapp1,owner1
test2,10.222.101.11,10.9.9.12,545,myapp1,owner1
mytest,10.9.7.12,10.9.9.12,545,myapp1,owner9
checkthis,10.9.7.12,10.9.9.12,545,myapp1,owner7
checkthis,10.222.101.11,10.9.9.12,545,myapp1,owner7
checkthis,10.3.2.111,10.9.9.12,545,myapp1,owner7

필요한 열은 아래에 나와 있지만 두 번째 열에 여러 IP가 포함된 행은 여러 행으로 분할되지 않습니다.

cat -- base.csv | cut -d, -f2-5 > newbase.csv

뭔가 제안해주실 수 있나요?

답변1

당신이 사용할 수있는밀러 네스트기능은터지다레코드 전체의 값:

$ mlr --csv nest --explode --values --across-records --nested-fs '/' -f IP_ADDRESS base.csv
NAME,IP_ADDRESS,PRI_IP,APP_CODE,APP_NAME,OWNER
test2,10.9.7.12,10.9.9.12,545,myapp1,owner1
test2,10.222.101.11,10.9.9.12,545,myapp1,owner1
mytest,10.9.7.12,10.9.9.12,545,myapp1,owner9
checkthis,10.9.7.12,10.9.9.12,545,myapp1,owner7
checkthis,10.222.101.11,10.9.9.12,545,myapp1,owner7
checkthis,10.3.2.111,10.9.9.12,545,myapp1,owner7

최신 버전의 경우 다음 --explode --values --across-records --nested-fs '/'과 같이 축약될 수 있습니다 .--evar '/'

mlr --csv nest --evar '/' -f IP_ADDRESS base.csv >newbase.csv

또는 awk를 사용하세요.

awk -F, '
  BEGIN{OFS=FS}
  {
    n = split($2,a,"/")
    for(i=1;i<=n;i++) {
      $2=a[i]; print
    }
  }
' base.csv >newbase.csv

관련 정보