Csv

如何根據第二列中的分隔符將 CSV 文件的單行拆分為多行

  • October 18, 2020

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

引用自:https://unix.stackexchange.com/questions/615151