最初の行の情報に基づいて複数の行をグループ化する方法は?

最初の行の情報に基づいて複数の行をグループ化する方法は?

次のデータファイルがあります。

1 1 1 1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 2 3 3 3 3 3  . . .
1 0 4 4 3 1 2 0 0 0 3 1 1 2 1 1 1 1 1 1 0 1 1 3  . . .
0 0 0 0 0 0 0 3 3 1 1 2 3 2 1 2 2 3 1 2 3 1 2 2  . . .          
.
.
.

まず、同じ5つの値の間にスペースを挿入したいと思います。最初の行を見て、同じ5つの数字を列に入れてから、これらのグループ文字の間にスペースを入れないようにします。最初のステップ:

1 1 1 1 1  1 1 1 1 1  1  2 2 2 2 2  2 2 2  3 3 3 3 3  . . .
1 0 4 4 3  1 2 0 0 0  3  1 1 2 1 1  1 1 1  1 0 1 1 3  . . .
0 0 0 0 0  0 0 3 3 1  1  2 3 2 1 2  2 3 1  2 3 1 2 2  . . .          
.
.
.

2番目のステップ(出力):

11111  11111  1  22222  222  33333  . . .
10443  12000  3  11211  111  10113  . . .
00000  00331  1  23212  231  23122  . . .          
.
.
.

また、実際のデータでは、さまざまなグループサイズを試してみたい場合があります。だから柔軟なスクリプトが必要です。提案がありますか?

ベストアンサー1

これはawkスクリプトです。5数字のみを変更すると、別のグループ化を実行できます。

awk '
NR==1{
 previous = $1
 for(i = 1;i<=NF+1;i++)
  if($i!=previous){
    col[++numcol] = i
    previous = $i
  }
}
{ j = 1; start = 1
  for(i = 1;i<NF;i++){
   printf "%s",$i
   if(i==col[j]-1){printf "  "; start = col[j++]}
   else if((i-start+1)%5==0)printf "  "
  }
  printf "%s\n",$NF
}'

最初の部分は行1のみを処理し、配列内の各同じ数値セットの開始列を収集しますcol。 2番目の部分は、開始列の5列またはシーケンスの終わりを除いて各フィールドを無制限に印刷します。

おすすめ記事