Menggunakan grep atau sed untuk melakukan ini tidak akan direkomendasikan sebagai grep tidak dapat menghitung dan sed adalah sangat sulit untuk melakukan segala jenis aritmatika (itu harus berupa penghitungan berbasis ekspresi reguler, non-pemula untuk kebanyakan orang kecuali untuk yang berdedikasi).
$ 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 kode mengasumsikan bahwa 0 harus menjadi angka pertama, lalu pertahankan yang diinginkan nomor baris untuk baris saat ini dalam variabel nr . Jika sebuah angka dibaca dari input yang memerlukan satu atau beberapa baris untuk disisipkan, hal ini dilakukan oleh while loop (yang juga menambahkan nr variabel).
Angka di <...> diuraikan dengan menentukan < itu dan > harus digunakan sebagai pembatas bidang. Nomornya kemudian di $2 (bidang ke-2).
Ini mungkin jauh dari efisien...
$ 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>
Pertama, saya menggunakan tr untuk mendapatkan dua bidang yang dipisahkan tab dari file.
Kedua, saya menggunakan tr lagi untuk mengganti '>' dengan spasi, karena jika perintah awk saya akan gagal :-/
Profesional awk di sekitar sini kemungkinan besar akan tertawa sekarang :-)
Ketiga, awk -command akan membandingkan jumlah baris yang diproses ke kolom kedua. Jika jumlah baris lebih kecil, penanda akan dicetak dan bertambah shift yang ditambahkan ke jumlah baris pada perbandingan sebelumnya.
Keempat dan kelima:Saya membatalkan perubahan yang saya buat sebelumnya dengan tr .
Saya mendapat inspirasi dari https://unix.stackexchange.com/a/190707/364705
Saya bukan awk pria, tapi ini juga tampaknya melakukannya. Saya selalu terbuka untuk peningkatan:
awk -F '[<>]' -v num=0 '
{
while(num < $2) {
print "----";
num++
}
print $1"<"$2">"
num++
}' file
Pertama-tama kita atur pemisah field agar sesuai dengan karakter < dan > , jadi setiap baris dipisahkan pada karakter-karakter ini. Misalnya, baris pertama akan ditetapkan ke $1=A dan $2=0 .
Kemudian kita atur variabel num=0 . Kami menggunakannya sebagai penghitung baris:Jika jumlah baris saat ini $2 lebih besar dari penghitung baris, cetak ---- , tingkatkan pengulangan penghitung hingga kedua nilai sama. Kemudian cetak $1<$2> dan tingkatkan penghitung.