我的 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