パイプと角括弧で区切られたBashスクリプトの配列

パイプと角括弧で区切られたBashスクリプトの配列

|で区切られたテキスト・ファイルの内容を変換するには、bashスクリプトを作成する必要があります。そして] ...

次のテキストファイルの内容:

Col1|Col2|Col3|P1]P2]P3|D1]D2]D3||Col4 
Col3|ColA|ColA|PA]PB]|DA]DB]|ColD||

希望の出力は次のとおりです。

Col1 Col2 Col3 P1 D1 0 Col4
Col1 Col2 Col3 P2 D2 0 Col4
Col1 Col2 Col3 P3 D3 0 Col4
Col3 ColA ColA PA DA ColD 0
Col3 ColA ColA PB DB ColD 0
Col3 ColA ColA 0 0 ColD 0

編集:]の後の空の列と空のデータは両方とも0に置き換えられます。

ありがとうございます。

ベストアンサー1

サンプルスクリプトを使用して実行できます(私のスクリプトは最適ではありませんが機能します)。

awk -F'[]|]' '{
   print $1,$2,$3,$4,$7,$10
   print $1,$2,$3,$5,$8,$10
   print $1,$2,$3,$6,$9,$10 }' input_filename

または

awk -F'[]|]' '{
   for (i = 4; i <= 6; i++)
     print $1,$2,$3,$i,$(i+3),$10}' input_filename

あなたは変更することができます出力フィールド区切り記号(デフォルトは空白)-v OFS=','

タスクを実行するためのより柔軟な方法(内部フィールドの分離)を提供した@steeldriverに感謝します。

awk -F'|' '{
  split($3,a,/]/); n = split($4,b,/]/); 
  for(i=1;i<=n;i++) print $1,$2,a[1],a[i+1],b[i],$5}' input_filename

編集された質問によると、空のフィールドを(0)に置き換えるには、0次のスクリプトを使用して実行できます。

awk -F'[]|]' '{ 
   for (i = 1; i <= 11; i++) if ($i == "") $i=0}
   {
   print $1,$2,$3,$4,$7,$10,$11
   print $1,$2,$3,$5,$8,$10,$11
   print $1,$2,$3,$6,$9,$10,$11 }' input_filename

あなたのコメントによると、スクリプトは次のようになります。

awk -F'|' -v OFS="\t" '{
 n = split($4,D,"]"); split($5,E,"]");
 for (i = 1; i <= n; i++) {
     if (D[i] == "") D[i]=0;
     if (E[i] == "") E[i]=0;}
     print $1,$2,$3,D[i],E[i],$6,$7 }' input_file 

おすすめ記事