GNU/Linux >> Belajar Linux >  >> Linux

Bagaimana cara menambahkan beberapa simbol (atau hanya menambahkan baris baru) jika angka dalam teks tidak bersambung

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.


Linux
  1. Cara Menyisipkan Teks di awal setiap baris di Vim

  2. Bagaimana cara menambahkan baris baru ke akhir file?

  3. Bagaimana Cara Menambahkan Aplikasi ke Manajer Jendela Gnome?

  1. Apa Simbol Baris Baru Di Zsh's Ps1?

  2. Mengapa Beberapa Port Dilaporkan Oleh Nmap Difilter Dan Bukan Yang Lain?

  3. Tambahkan kolom angka di shell Unix

  1. Cara Menambahkan Nomor Baris Ke File Teks Di Linux

  2. Apakah Paket Yang Baru Saya Instal Sah, Dan Jika Tidak Bagaimana Cara Menghapusnya?

  3. Bagaimana cara menyisipkan teks di awal file?