Metin işleme araçları bilimsel programcıya neden lâzım?

Hesaplamalı bir model için program yazıyorum. Hata yapmaya çok yatkın olduğum için de uzun uzadıya test ediyorum. En sevdiğim test aracı “printf“: Değişkenleri ekrana yazdırıp, sonuçların beklenene uyup uymadığına bakıyorum.

Programım meselâ şöyle şeyler çıkarabiliyor:

250 250 250 250
Agents: 354 471	, 3 4 --> 4 4
250 250 249 251
Agents: 371 210 , 4 3 --> 3 3
250 250 250 250
Agents: 718 551	, 3 4 --> 4 4
...

Bunların her biri bir zaman adımı. Özel olarak, 1 4 (veya 4 1) –> 2 2, 1 4 (veya 4 1) –> 3 3 durumlarını test ediyordum. Eğer program doğruysa bu durumların aşağı yukarı eşit sayıda (%50 ihtimalle) gerçekleşmesi lâzım. Önce küçük sayılarda çıktıları aldım ve bu durumları parmakla saydım. Sonra aklım başıma geldi: Parmakla saymakla ne uğraşayım, çıktıyı bir dosyaya yazdırarak grep ve wc kullandım.

$ ./program > cikti.txt
$ grep "1 4 --> 2 2" cikti.txt | wc -l
(ve benzeri)

komutları ile, aradığım durumun kaç kere gerçekleştiğini bilgisayarım bana söyledi.

Elbette bu sayma işini programın içinde de yapabilirdim, ama bunun için kodu ciddi şekilde değiştirmek gerekirdi. Oysa azıcık bash ve azıcık GNU metin işleme komutları bilgisi ile işi kotardım.

Bu tarz tecrübeler bana şunları öğretti:

  • Linux kullanın. Standart bir GNU/Linux ortamında program yazarken çok işinize yarayacak araçlar bulunduğunu keşfedeceksiniz. Evet, programın kendisi için hangi işletim sistemi kullandığınız önemli değildir, ama programı destekleyen bir “ekoloji” programcıya her zaman kolaylık sağlar.
  • Programlarınız komut satırında çalışsın. Kara ekrandan korkmayın; bash ve benzeri komut derleyiciler programınızı aklınıza gelmedik şekillerde kullanmanızı sağlar. Programınız çalışma parametrelerini interaktif olarak değil, komut satırı argümanları şeklinde alsın. Böylece basit kabuk betikleri (script) ile programınızı değişik parametrelerle otomatik çalıştırabilirsiniz. Meselâ yüz tane hesaplama deneyini yapmak için bilgisayarınız bütün gece çalışırken siz gidip uyuyabilirsiniz.
  • Biraz kabuk programlama öğrenin, meselâ bash veya zsh. Böylece işlemlerinizi otomatikleştirebiirsiniz.
  • Gerçekten gerekmedikçe programın çıktısını bir dosyaya değil ekrana yazdırın (stdout ve stderr akışlarını kullanın). Lüzumu halinde komut satırında çıkış yönlendirme operatörü (>) ile çıktıyı bir dosyaya yazdırabilirsiniz. Bu şekilde ayırmak çalışmada esneklik sağlar. Meselâ bir betikle çıktı dosya isimlerinin otomatik üretilmesini sağlayabilirsiniz. Veya programın çıktısını dosya yerine bir boru hattı (|) ile başka bir programa yönlendirebilirsiniz.
  • Programınız çıktısını dosyaya yazıyor bile olsa, ikili (binary) biçimde değil, metin (text) biçiminde yazsın. Böylece verilere bakıp okuyabilme imkânınız olur. Sadece göz gezdirmek bile hataları yakalamak için etkili bir yöntemdir. Metin dosyası ikili dosyadan daha büyük olur, ama bu devirde bunun önemi yok.
  • Programınız düz metin üretirse, GNU metin işleme araçlarını kullanarak çıktı dosyalarını çok değişik (ve yaratıcı) şekillerde manipüle edebilirsiniz. C gibi bir dille metin işleme epey zordur. İhtiyacınızı tam karşılayan bir araç hazırda yoksa, Python veya Perl gibi bir dille hazırlayıp kullanabilirsiniz.

Şu komutları özellikle faydalı buluyorum.

  • grep: Bir dosyada, verilen bir metin parçasına veya düzenli ifadeye uyan satırları ekrana basar. Birçok özelliği olan güçlü bir komut, ama en basit haliyle bile yararlı.
  • awk: Satır ve sütun şeklinde düzenlenmiş dosyaları kolayca işlemek için hazırlandı. Dosyayı satır satır alıp seçilen sütunlarda işlem yapabilir, veya belli kalıplara uyan satırları seçebilirsiniz. Başlı başına bir programlama dili olarak kullanılabilir, ama tek satırlık komutlarla bile müthiş işler yapabiliyor.
  • sed: Özellikle bir boru hattı (pipeline) üzerinde, başka programların çıktılarını süzmek veya değiştirmek için tasarlanmış. Bul-değiştir işlemlerinde özellikle güçlü.
  • wc: Bir dosyadaki (veya giriş akışındaki) harfleri, kelimeleri ve/veya satırları sayar. Meselâ yukarıda verdiğim örnek grep’in çıktısının kaç satır olduğunu veriyor.
  • cat: Bir veya birkaç dosyanın içeriğini altalta ekrana yazar. Dosyaları birleştirip boru hattıyla başka komutlara göndermek için de birebir. Kardeşi tac komutu ise dosyalardaki satırları ters sırayla basar. İkisinde de satırları numaralandırmak mümkün.
  • head: Bir dosyanın ilk on satırını ekrana yazar. Daha az veya daha çok satır da basabilir. Kardeşi tail komutu ise dosyanın son satırlarını basmak için kullanılır.
  • cut: Dosyadan belli sütunları ayırmak için kullanılır. Tersi işlem olarak, paste komutu ayrı dosyalardaki sütunları birleştirerek tek bir dosya hazırlar.
  • sort: Dosyayı istenen sütunlara göre, alfabetik veya sayısal olarak sıralar.
  • uniq: Alt alta gelen mükerrer (birbirinin aynı) satırları siler. Genellikle sort‘tan sonra, tekrarları kaldırmak için kullanılır. Ama tekrarlananların sayılarını bulmak için de kullanılabilir.
  • join: Farklı dosyalardaki kayıtları, ilişkisel veritabanlarındaki gibi, ortak bir sütunla birleştirerek tek bir dosya yaratmak için kullanılır.

Bu tariflerdeki “ekrana yazmak” ve “dosyaya yazmak” eylemleri, aslında yönlendirme işlemleri sayesinde birbiri yerine geçebiliyor. Komut satırının büyük bir gücü bu.

David Mertz’in yazdığı “Using the GNU text utilities” bu komutlar hakkında zamanın eskitemediği kısa ve öz bir kaynak.

Reklamlar

Kaan Öztürk hakkında

Kaan Öztürk İstanbul’da doğdu. İstanbul Lisesi ve Boğaziçi Fizik mezunu. Rice Üniversitesi‘nde uzay fiziği alanında doktora yaptı. Işık ve Yeditepe üniversitelerinde ders verdi. 2015-2016 döneminde Rice'da ziyaretçi araştırmacı olarak çalıştı. Bugünlerde Sabancı Üniversitesi'nde optimizasyon ve yapay öğrenme konularında doktoraüstü araştırmacı olarak çalışıyor.

22 Nisan 2012 tarihinde Bilimsel Programlama içinde yayınlandı ve , , olarak etiketlendi. Kalıcı bağlantıyı yer imlerinize ekleyin. 2 Yorum.

  1. Belki bu listeye “cron” ve linux editorlerini de “vi, emacs” eklemek yerinde olur.
    cron: otomatik hale getirdiginiz isleri istediginiz zaman ya da zaman araliklarinda isleme sokmanizi saglar.

    “awk” programa dilini de sadece stream editor olarak degil “BEGIN{}” bloku icinde “getline” anahter kelimesi ile dizi tabanli kullanip, hizli bir C prototiplemesi yapmak da mumkundur.

  1. Geri bildirim: Programları komut satırında çalıştırmak | PythonBilim

Bir Cevap Yazın

Aşağıya bilgilerinizi girin veya oturum açmak için bir simgeye tıklayın:

WordPress.com Logosu

WordPress.com hesabınızı kullanarak yorum yapıyorsunuz. Çıkış  Yap / Değiştir )

Twitter resmi

Twitter hesabınızı kullanarak yorum yapıyorsunuz. Çıkış  Yap / Değiştir )

Facebook fotoğrafı

Facebook hesabınızı kullanarak yorum yapıyorsunuz. Çıkış  Yap / Değiştir )

Google+ fotoğrafı

Google+ hesabınızı kullanarak yorum yapıyorsunuz. Çıkış  Yap / Değiştir )

Connecting to %s

%d blogcu bunu beğendi: