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 的行拆分為多行。
cat -- base.csv | cut -d, -f2-5 > newbase.csv
你能建議嗎?
您可以使用Miller 嵌套函式在記錄之間展開值:
$ 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 '/'
somlr --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