私の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