2番目の列の区切り文字に基づいてCSVファイルの単一行を複数行に分割する方法

2番目の列の区切り文字に基づいてCSVファイルの単一行を複数行に分割する方法

私のbase.csvファイルにはいくつかのエントリがあります。以下はそのうちの1つの例です。

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

注:2番目の列は、常に区切り文字で区切られた1つ以上のIPアドレスです。/

生成された2番目の列には常に1つの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

必要な列を以下に示しますが、2番目の列に複数の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

おすすめ記事