2017-06-03 15 views
0

下劃線和逗號後面的數據將轉到下一行,並且數據從開頭到管道添加在它們之前。將第一個條目添加到下一行,並將逗號和下劃線之後的數據從上一行移到下一行

樣本數據:

1.2.4.0/24|24151_24409_24406  
37.99.128.0/19|47794_47795,48695  
37.142.128.0/17|21450,65555 

預期的結果應該是:

1.2.4.0/24|24151  
1.2.4.0/24|24409  
1.2.4.0/24|24406  
37.99.128.0/19|47794  
37.99.128.0/19|47795 
37.99.128.0/19|48695 
37.142.128.0/17|21450  
37.142.128.0/17|65555 

有沒有辦法做到這一點?

+0

用四個空格前綴代碼。請看[編輯幫助](http://stackoverflow.com/editing-help)。 – Cyrus

+0

用bash:'while IFS =「|,_」read -r -a col; do for((i = 1; i <$ {#col [@]}; i ++)); do echo「$ {col [0]} | $ {col [$ i]}」;完成;完成 Cyrus

回答

2

隨着AWK:

awk -F '[|,_]' '{for (i=2; i<=NF; i++) print $1 "|" $i}' file 

輸出:

 
1.2.4.0/24|24151 
1.2.4.0/24|24409 
1.2.4.0/24|24406 
37.99.128.0/19|47794 
37.99.128.0/19|47795 
37.99.128.0/19|48695 
37.142.128.0/17|21450 
37.142.128.0/17|65555 

可變NF被設定爲在輸入記錄中的字段的總數。

0

呆子溶液:

awk -F'|' '{ n=split($2,a,/[_,]/); for(i=1;i<=n;i++) print $1,a[i] }' OFS='|' file 

輸出:

1.2.4.0/24|24151 
1.2.4.0/24|24409 
1.2.4.0/24|24406 
37.99.128.0/19|47794 
37.99.128.0/19|47795 
37.99.128.0/19|48695 
37.142.128.0/17|21450 
37.142.128.0/17|65555 

  • split($2,a,/[_,]/) - 劃分第二字段值而進入由圖案/[_,]/限定件和返回數字的元素crea泰德n
0

這可能爲你工作(GNU SED):

sed -r 's/((.*)\|[^_,]*)[_,]/\1\n\2|/;l;P;D' file 

更換由一個換行符從接下來的兩個領域分離的前兩個字段的第一_,。打印第一行然後重複該過程,直到模式空間上的所有字段都被佔據。

相關問題