次のデータファイルがあります。
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列またはシーケンスの終わりを除いて各フィールドを無制限に印刷します。