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.