grep
の使用 または sed
これを行うため、grep
としては推奨されません 数えられず、sed
本当に難しい あらゆる種類の算術演算を実行できます (正規表現ベースのカウントである必要があり、熱心な人を除いて、ほとんどの人にとって初心者ではありません)。
$ awk -F '[<>]' '{ while ($2 >= ++nr) print "---"; print }' file
A<0>
A<1>
A_D2<2>
A_D2<3>
A<4>
---
A_D2<6>
---
---
A<9>
A_D2<10>
---
---
A<13>
awk
コードは 0
を想定しています 最初の番号である必要があり、wanted を維持します 変数 nr
の現在の行の行番号 . 1 行または数行の挿入が必要な数値が入力から読み取られる場合、これは while
によって行われます。 ループ (これも nr
をインクリメントします) 変数)
<...>
の数字 <
を指定することで解析されます と >
フィールド区切り文字として使用する必要があります。数値は $2
になります (2 番目のフィールド)。
これはおそらく効率的とは言えません...
$ tr '<' '\t' < testfile | tr '>' ' ' \
| awk '{ while (NR + shift <= $2) { print "-----"; shift++ }; print }' \
| tr '\t' '<' \
| tr ' ' '>'
A<0>
A<1>
A_D2<2>
A_D2<3>
A<4>
-----
A_D2<6>
-----
-----
A<9>
A_D2<10>
-----
-----
A<13>
まず、tr
を使用します ファイルからタブで区切られた 2 つのフィールドを取得します。
次に、tr
を使用します そうしないと awk コマンドが失敗するため、もう一度「>」をスペースに置き換えます:-/
ここら辺の専門家は笑ってしまうでしょう :-)
第三に、awk
-command は、処理された行数を 2 番目のフィールドと比較します。行数が少ない場合、マーカーを出力して shift
を増やします これは、前の比較の行数に追加されます。
4 番目と 5 番目:以前 tr
で行った変更を取り消しています .
https://unix.stackexchange.com/a/190707/364705 からインスピレーションを得ました
私は awk
ではありません 男、しかしこれもそれを行うようです。私は常に改善を受け入れています:
awk -F '[<>]' -v num=0 '
{
while(num < $2) {
print "----";
num++
}
print $1"<"$2">"
num++
}' file
最初に、フィールドセパレーターを文字 <
に一致するように設定します および >
、したがって、各行はこれらの文字で分割されます。たとえば、最初の行は $1=A
に割り当てられます と $2=0
.
次に、変数 num=0
を設定します .行カウンターとして使用します。現在の行の番号が $2
の場合 行カウンターより大きい場合、----
を出力します 、両方の値が等しくなるまでカウンターの繰り返しをインクリメントします。次に $1<$2>
を出力します カウンターをインクリメントします。