5

以下のようなリストがあります。1 列は位置であり、他の列はこの質問にとって重要ではありません。

1  1 2 3 4 5
2  1 2 3 4 5
5  1 2 3 4 5
8  1 2 3 4 5
9  1 2 3 4 5
10 1 2 3 4 5
11 1 2 3 4 5

リストが連続して読めるようにギャップを埋めたい

1  1 2 3 4 5
2  1 2 3 4 5
3  0 0 0 0 0
4  0 0 0 0 0 
5  1 2 3 4 5
6  0 0 0 0 0 
7  0 0 0 0 0 
8  1 2 3 4 5
9  1 2 3 4 5
10 1 2 3 4 5
11 1 2 3 4 5

私は awk とシェル スクリプトに精通していますが、どのような方法で実行しても問題ありません。助けてくれてありがとう..

4

4 に答える 4

1

次の awk ワンライナーを使用できます。

awk '{b=a;a=$1;while(a>(b++)+1){print(b+1)," 0 0 0 0 0"}}1' input.file

ヒアドキュメント入力でテスト済み:

awk '{b=a;a=$1;while(a>(b++)+1){print(b+1)," 0 0 0 0 0"}}1' <<EOF
1  1 2 3 4 5
2  1 2 3 4 5
5  1 2 3 4 5
8  1 2 3 4 5
9  1 2 3 4 5
10 1 2 3 4 5
11 1 2 3 4 5
EOF

出力は次のとおりです。

1  1 2 3 4 5
2  1 2 3 4 5
3  0 0 0 0 0
4  0 0 0 0 0
5  1 2 3 4 5
6  0 0 0 0 0
7  0 0 0 0 0
8  1 2 3 4 5
9  1 2 3 4 5
10 1 2 3 4 5
11 1 2 3 4 5

説明:

すべての入力行で、最初の列の値がどこにb設定されます。とが初期化される順序のため、 は、不足している行をゼロで埋めて挿入する限り実行されるループで使用できます。スクリプトの最後の は、最終的に入力行を出力します。aababwhileb < a-11

于 2013-07-10T22:21:27.833 に答える
0

別の方法は次のとおりです。

awk '{x=$1-b;while(x-->1){print ++b," 0 0 0 0 0"};b=$1}1' file

テスト:

$ cat file
1  1 2 3 4 5
2  1 2 3 4 5
5  1 2 3 4 5
8  1 2 3 4 5
9  1 2 3 4 5
10 1 2 3 4 5
11 1 2 3 4 5

$ awk '{x=$1-b;while(x-->1){print ++b," 0 0 0 0 0"};b=$1}1' file
1  1 2 3 4 5
2  1 2 3 4 5
3  0 0 0 0 0
4  0 0 0 0 0
5  1 2 3 4 5
6  0 0 0 0 0
7  0 0 0 0 0
8  1 2 3 4 5
9  1 2 3 4 5
10 1 2 3 4 5
11 1 2 3 4 5
于 2013-07-11T01:41:39.257 に答える