2017-06-03 3 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 

ありますか? AWKで

+0

コードに4つの空白を付けます。 [edit-help](http://stackoverflow.com/editing-help)を見てください。 – Cyrus

+0

bash: 'while IFS =" |、_ "読み取り-r -a col; for((i = 1; i <$ {#col [@]); i ++));エコーを行う "$ {col [0]} | $ {col [$ i]}";完了しました。完了<ファイル名> – Cyrus

答えて

2

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

溶液gawkは:

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,/[_,]/) - パターン/[_,]/によって定義された断片に第2フィールドの値を分割し、数を返すを要素creaのテッドn
0

これはあなた(GNU SED)のために働くかもしれません:

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

は改行で次の2つのフィールドから分離された第1の二つのフィールドによる最初の_または,を交換してください。最初の行を出力し、パターンスペースのすべてのフィールドが考慮されるまでプロセスを繰り返します。

関連する問題