내 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