Cara yang elegan adalah memperlakukan setiap karakter sebagai bidang. Jika Anda mengatur FS ke string kosong, awk akan membaginya begitu saja. Kemudian Anda dapat mengatur bidang ke-22 sesuai keinginan Anda. Hanya ingat untuk mengatur OFS ke string kosong juga sehingga tidak ada spasi (OFS default) antara semua karakter dalam output.
awk -vFS="" -vOFS="" 'NR==400,NR==600 {$22="B"}; {print}'
Jelas, ini akan melakukan pemisahan yang tidak perlu pada garis di luar jangkauan. Kita bisa mengatur pemisah bidang sebelum garis 400 dan kembali setelah 600. Tapi mengapa terpecah sama sekali di sini ketika kita memiliki substr ()?
Mari kita buat string dengan 21 karakter pertama + "B" + sisa baris asli untuk baris-baris penting.
awk '{s=$0}; NR==400,NR==600 { s=substr($0,1,21) "B" substr($0,23)}; {print s}'
(Adalah mungkin untuk melakukannya tanpa s, hanya dengan menetapkan $ 0 nilai baru tetapi ketika kami menetapkan $ 0, itu dibagi lagi sesuai dengan aturan, dan tidak ada alasan untuk mengorbankan kecepatan untuk langkah itu sekarang.)