如何根据第二列中的分隔符将 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 地址/

我希望创建的newbase.csv第二列始终只有一个 ip。

因此所需的 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 的 rowns 拆分为多行。

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 '/'so

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

相关内容