Skip to content

Latest commit

 

History

History
1306 lines (895 loc) · 100 KB

chapter2.md

File metadata and controls

1306 lines (895 loc) · 100 KB

GNU/Linux Komutları

Terminalde kullanılabilecek komutların tamamı oldukça uzun bir liste oluşturabilir. Kitapta verilen komutlar buradaki örneklerin ve problemlerin çözülmesi için gerekli olan komutlardır. Listenin tamamı aşağıdaki kaynaklarda bulunabilir:

Yukarıdaki kaynaklara ek olarak, ExplainShell adlı websayfasını kullanarak, kitaptaki komutların veya başka kaynaklarda karşılaştığınız komutların açıklamalarını görebilirsiniz.

Ayrıca, bu kitapta verilen komutların fazla sayıda opsiyonları (veya argümanları) bulunmaktadır. Bu kitapta sadece Veri Analizi ve Görüntüleme dersi için yeterli olanları gösterilecektir. Bütün opsiyonları görmek için man komut ile komuta ait detaylı bilgilere ulaşılabilir.

Başlamadan Önce

Aşağıdaki komutlardaki örneklerin ve bölüm sonlarındaki soruların yapılabilmesi için kitapla beraber hazırlanmış arşiv dosyası aşağıdaki komutlar yardımıyla indirilip açılmalıdır.

curl -L https://goo.gl/i4wD9H > veri-analizi-bundle.tar.gz tar xzf veri-analizi-bundle.tar.gz

man komutu

İngilizce orijinal tarifi: "an interface to the on-line reference manuals"

Komutların farklı fonksiyonlarını ve görevlerini görüntüler. Örneğin ls komutunun kullanımını öğrenmek için man ls yazıp enter tuşuna basıldığında aşağıdaki ekran görülür. Aşağı ve yukarı ok tuşları ile interaktif olarak doküman okunabilir ve açılan dosyadan q tuşu ile çıkış yapılır.

<<Şekil 2.1 ls komutunun man komutu ile açıklanması

ls komutu

İngilizce orijinal tarifi: "list directory contents"

Geçerli dizindeki dosyaların alfabetik olarak sıralanmış listesini gösterir. Nokta (.) karakteri ile başlayan dosya isimlerini ilk sıraya koyar. Birçok opsiyonu olmakla birlikte, en çok kullanılan opsiyonlar şunlardır:

  • ls -a (all) : Geçerli dizindeki tüm dosyaların listesini gösterir. Gizli dosya ve dizinleri de gösterir.
  • ls -l (long) : Geçerli dizindeki tüm dosyaları ayrıntılarıyla gösterir. (izin - kullanıcı - boyut - tarih - dosya adı)
  • ls -t (time) : Geçerli dizindeki dosyaları yüklenme tarihlerine göre sondan başa doğru sıralayarak gösterir.
  • ls -S (size) : Geçerli dizindeki dosyaları boyutlarına göre büyükten küçüğe doğru sıralayarak gösterir.
  • ls -r (reverse) : Sıralama düzenini tersine çevirerek gösterir. Eğer başka bir seçenekle kullanılmamışsa alfabetik sıralamanın tersine göre.
  • ls -R (recursive) : Tüm dosyaları alt dizinleri ve içerikleri ile birlikte gösterir.
  • ls -h (human readable) : Tüm dosyaları insan okunabilir şekilde gösterir. Ama tek başına işlevi yoktur. Dosya boyutunu gösteren seçenekler ile birlikte kullanılmalıdır.

Klasörünüzde, veri-analizi-bundle.tar.gz adlı arşivi açtıktan sonra ls komutunun çıktısı aşağıdakine benzer olacaktır. Eğer kullandığınız terminalde renkli ls çıktısı ayarı yapılmışsa, klasörler (mavi), resimler (pembe), arşiv dosyaları (kırmızı) gibi farklı öğeler farklı renkler ile gösterilecektir.

Şekil 2.2a ls komutunun çıktısındaki renklendirme

Seçenekler birleştirilerek de kullanılabilirler. Örnek; ls -lrt dosyaları tarihlerine göre baştan sona doğru ve ayrıntılarıyla gösterir.

<<Şekil 2.2b ls komutunun farklı opsiyonları/argümanları

cd komutu

Klasör değiştirerek, dizinler arası gezinmeyi sağlayan komuttur. Göreceli veya mutlak olarak klasör belirtmek mümkündür. Göreceli klasör belirtmek o anda çalışılan klasöre göre konum belirleyerek, mutlak konum belirleme ise kökten (İng. root) (/) başlayarak gidilmek istenen yer belirterek gerçekleşmektedir.

  • cd <klasör.adı> : <klasör.adı> isimli klasörün içine girmeyi sağlar.
  • cd ~ : Hangi klasörde olunursa olunsun kullanıcının home klasörüne gitmeyi sağlar.
  • cd .. : İşlem yapılan klasörün bir üst klasörüne geri dönmeyi sağlar.
  • cd ../.. : İşlem yapılan klasörün iki üst klasörüne gitmeyi sağlar.
  • cd - : İşlem yapılan klasörden bir önce girilen klasöre gitmeyi sağlar.

Terminalde sadece cd yazarak Enter tuşuna basıldığında cd ~ şeklinde çalışır ve kullanıcının home klasörüne geçiş yapılır.

<<Şekil 2.3 cd komutunun farklı kullanımları

%%%% TODO cd example is not clear

Boşluk karakteri içeren dosya ve klasör isimlerine dair dikkat edilmesi gereken durum hakkında ilgili bölümü okuyunuz.

Sorular

  • find-file adlı klasör içinde cd ve ls komutları yardımıyla image.jpg dosyasını bulunuz.

mkdir komutu

İngilizce orijinal tarifi: "make directories"

Geçerli dizinde klasör açmayı sağlayan komuttur.

  • mkdir <klasör.adı> : Geçerli dizin içine <klasör.adı> isimli klasörün açılmasını sağlar.
  • mkdir -p <klasör.adı1>/<klasör.adı2>/<klasör.adı3> : Geçerli klasör içine <klasör.adı1> isimli klasör, alt klasörü olarak <klasör.adı2> isimli bir klasör ve onun da alt klasörü olarak <klasör.adı3> isimli klasör açar. Komutun çalışabilmesi için klasör sayılarında bir sınırlama yoktur.

<<Şekil 2.4 mkdir komutunun kullanımı

pwd komutu

İngilizce orijinal tarifi: "print name of current/working directory"

İçinde bulunulan klasörün mutlak konumunu ekranda gösterir.

<<Şekil 2.5 pwd komutunun kullanımı

touch komutu

Geçerli dizinde boş bir dosya açmayı sağlayan komuttur.

  • touch <dosya.adı> : Geçerli dizin içine <dosya.adı> isimli boş bir dosya oluşturur.

Sorular

  • touch komutu yardımıyla, test.png, test.mp3,test.doc adlı dosyalar oluşturulursa, bunlar sırasıyla resim, müzik ve Word dökümanı mı olurlar?
  • mkdir ve touch komutlarını kullanarak genomes adlı klasör oluşturup içinde aşağıda gösterilen klasör ve dosya yapısını oluşturunuz.

genomes adlı klasör yapısı

tree komutu kullanılarak resimdeki ağaç şeması elde edilebilir. tree klasör.adı şeklinde kullanıldığında istenen klasörün ağaç şeması şeklinde görünmesini sağlar.

Doğru klasör yapısı oluşturulduğunda genomes klasörü içinde find komutunun çıktısı aşağıdaki gibi olmalıdır:

<<genomes klasörü içeriği - find komutu çıktısı

rm komutu

İngilizce orijinal tarifi: "remove files or directories"

Geçerli dizinde bulunan dosyaları veya klasörleri silmeyi sağlar.

  • rm <dosya.adı> : Geçerli dizin içindeki <dosya.adı> isimli dosyanın silinmesini sağlar.
  • rm -r <klasör.adı> : Klasörleri altdizin ve içerisinde bulunan dosyalar ile birlikte siler. Komut bazı durumlarda çalışmadan önce onay ister ve onaylamak için y tuşuna basılmalıdır.

<<Şekil 2.6 rm komutunun kullanımı

Terminalde, "çöp kutusu" kavramı olmadığından dosyalar geri dönüşüme gitmeden silinir.

cp komutu

İngilizce orijinal tarifi: "copy files and directories"

Geçerli klasör içinde bulunan bir dosyanın, başka bir klasöre veya başka bir dosyanın üzerine kopyalanmasını sağlar.

  • cp <kaynak.dosya.adı> <hedef.dosya.adı> : Geçerli klasördeki <kaynak.dosya.adı> isimli dosyanın <hedef.dosya.adı> isimli dosya olarak kaydedilmesini sağlar.
  • cp -i <kaynak.dosya.adı> <hedef.dosya.adı> : Var olan bir dosya üzerine yazma durumlarında interaktif şekilde onay istenmesini sağlar.
  • cp -p : Kopyalanacak olan dosyanın kopyalama sırasında dosya ve klasör izinleri kısmında anlatılan izin ve özelliklerini değiştirmeden kopyalanmasını sağlar.
  • cp -r : Klasörleri alt dizinleri ve dosyaları ile birlikte kopyalar.
  • cp -u : Güncelleme olduğunda dosya ve klasörleri değiştirmeden kopyalar.

Kopyalanan dosya aynı klasör içine değil, farklı bir klasör içine kopyalanmak isteniyorsa; hedef klasörün ismi ~/<hedef.klasör.adı> şeklinde yazılmalıdır. Komutu kullanmak için kopyalanacak dosyanın bulunduğu klasör içinde olmaya gerek yoktur. Herhangi bir klasörden her klasöre kopyalama yapılabilir.

<<Şekil 2.7 cp komutunun kullanımı

%%%% TODO: cp komutu örneği geliştirilmeli, PATH (relative and absolute) kavramı bahsedilmeli

mv komutu

İngilizce orijinal tarifi: "move (rename) files"

Dosyaların aynı isimle ya da ismi değiştirilerek farklı bir klasör içine taşınmasını sağlar.

  • mv <dosya.adı> <hedef.klasör.adı> : Geçerli dizin içindeki dosya hedef klasöre kopyalanıp geçerli dizindeki kopyası silinir, böylelikle dosya hedef klasöre taşınmış olur. Bu işlem aynı klasör içinde gerçekleştirilirse dosya ismi değiştirilmiş olur.

<<Şekil 2.8 mv komutunun kullanımı

%%%% TODO mv example was not clear.. mv-ornek.txt has been updated by gamzebagımsız, can be improved further..

Boşluk karakteri içeren dosya ve klasör isimlerine dair dikkat edilmesi gereken durum hakkında ilgili bölümü okuyunuz.

Sorular

  • Sayı1000 isimli dosyanın sayılar adlı kopyasını oluşturun.
  • sayılar dosyasını depo isimli yeni bir klasör açarak içine taşıyın.
  • depo klasörünü depo2 klasörü olarak içindeki sayılar dosyası ile birlikte taşıyın.
  • touch komutu egzersizinde oluşturmuş olduğunuz genomes adlı klasörün içeriklerini, mkdir, touch, cp, mv komutlarını kullanarak aşağıdaki hale getiriniz.

Ulaşılması gereken klasör yapısı

Yukarıdaki soruda, fish klasörü altında bulunan penguen.fa dosyasının birds adlı klasörün altına taşınması için fish klasörü içinde olmak şart değildir. Herhangi bir klasörde iken uygun mv komutu ile taşıma gerçekleştirilebilir. Taşınacak dosyanın bulunduğu klasör veya hedef klasör mutlak veya göreceli olarak belirtilebilir. Aşağıdaki örnekte üç farklı geçerli dizinde bulunurken mv komutunun nasıl yazılacağı gösterilmiştir.

<<Şekil 2.8a mv komutunun geçerli dizine göre değişmesi

universiteler.tar.gz adlı arşiv dosyasının içeriği ÖSYM'nin 2015 tarihli kılavuzuna göre hazırlanmıştır. Her bir üniversite ve içerdiği fakülteler klasör olarak, bölümler de dosya olarak gösterilmiştir. Arşiv dosyasını açtıktan sonra aşağıdaki soruları cevaplayınız:

  • YTU altında "Tip Fakultesi" açınız.
  • YTU Tip Fakultesi altına Dahiliye ve Cildiye bölümleri açınız.
  • YTU'den "Iktisadi ve Idari Bilimler Fakultesi"ni kaldırınız.
  • YTU'ye Isik Univ. "Guzel Sanatlar Fakultesi"ni bölümleriyle beraber kopyalayınız.
  • IPEK UNIVERSITESI, Insan ve Toplum Bilimleri Fakultesi altındaki bütün ingilizce bölümleri kapatınız.

%%%% TODO we need more questions for cp, mv, mkdir

Uzun klasör isimlerini yazarken ilk birkaç harften sonra Tab tuşuna basıldığında klasör veya dosya adı tamamlanacaktır.

seq komutu

İngilizce orijinal tarifi: "print a sequence of numbers"

Belli artımlarla sayı oluşturulup ekranda görüntülenmesini sağlar. Üç farklı kullanım seçeneği vardır. Bunlar:

  • seq <sayı> : 1'den başlayarak, belirtilen sayıya kadar olan ardışık sayıları ekrana basar.
  • seq <sayı1> <sayı2> : Sayı1'den başlayarak sayı2'ye kadar olan ardışık sayıları ekrana basar.
  • seq <sayı1> <artım.miktarı> <sayı2> : sayı1'den başlayarak sayı2'ye kadar, belirtilen artım miktarı kadar artan sayıları ekrana basar.
  • seq -w : Sayıların eşit genişlikte olmasını sağlar. Böylelikle, üretilen sayılar alfabetik sıralama için uygun hale gelir ve sayısal sıralamaya gerek kalmaz.

<<Şekil 2.9 seq komutunun kullanımı

shuf komutu

İngilizce orijinal tarifi: "generate random permutations"

Rastgele sıralama yapılmasını sağlar.

  • shuf <dosya.adı> : Geçerli dizindeki <dosya.adı> isimli dosya içinde bulunan bilgilerin sıralamasını, rastgele permutasyonlar şeklinde gerçekleştirir.

Aşağıdaki örnekte de görüldüğü gibi, shuf komutu ve birçok komut, hem bir dosya üzerinde çalıştırılabilir hem de çubuk ile başka bir komutun çıktısı üzerinde çalıştırılabilir.

<<Şekil 2.10 shuf komutunun kullanımı

Sorular

  • 1-100 arası 5'e bölünebilen sayıları ekranda görüntüleyin.
  • 1-50 arası 3'e bölünebilen rakamları ekranda görüntüleyin.

cat komutu

İngilizce orijinal tarifi: "concatenate files and print on the standard output"

Dosyaların görüntülenmesini sağlar. Komutun tac şeklinde, tersten çalıştırılarak dosyanın sondan başa doğru görüntülenmesi de mümkündür.

  • cat <dosya.adı> : Geçerli dizinde bulunan dosyaların içinin ekranda görüntülenmesini sağlar.

<<Şekil 2.11 cat ve tac komutlarının kullanımı

head komutu

İngilizce orijinal tarifi: "output the first part of files"

Dosya içeriğinin başından ne kadar uzunlukta görüntüleneceğini belirler.

  • head <dosya.adı> : Geçerli dizinde bulunan dosya.adı isimli dosyanın ilk 10 satırının görüntülenmesini sağlar.
  • head -numara <dosya.adı> : Geçerli dizinde bulunan dosya.adı isimli dosyanın baştan itibaren, belirtilen sayıda satırının görüntülenmesini sağlar.
  • head -n -<sayı> <dosya.adı> : Geçerli dizinde bulunan dosya.adı isimli dosyanın son sayı kadar satırı hariç bütün satırların görüntülenmesini sağlar.

tail komutu

İngilizce orijinal tarifi: "output the last part of files"

Dosya içeriğinin sonundan kaç satır görüntüleneceğini belirler. Satırları tersten değil olması gereken sırada görüntüler.

  • tail <dosya.adı> : Geçerli dizinde bulunan dosya.adı isimli dosyanın son 10 satırının görüntülenmesini sağlar.
  • tail -numara <dosya.adı> : Geçerli dizinde bulunan dosya.adı isimli dosyanın sondan itibaren, belirtilen sayıda satırının görüntülenmesini sağlar.
  • tail -n +<sayı> <dosya.adı> : Geçerli dizinde bulunan dosya.adı isimli dosyanın sayı. satırından itibaren görüntülenmesini sağlar.

<<Şekil 2.12 head ve tail komutlarının kullanımı

Şekil 2.13 head ve tail komutlarının farklı kullanımları

Sorular

  • 20'den başlayarak sıralı 55. sayıyı ekranda görüntüleyin.
  • İlk 175 sayının son 10 tanesini ekranda görüntüleyin.
  • 7'ye bölünebilen ilk 15 sayının rastgele seçilmiş 5 tanesini ekranda görüntüleyin.
  • sayı1000 dosyasından 850-860 arasındaki sayıları ekranda görüntüleyin. (850 ve 860 dahil.)
  • sayı1000 dosyasının en ortasında bulunan iki sayıyı ekranda görüntüleyin.
  • sayı1000 dosyasındaki ilk çift sayıdan sonraki 24. sayıyı ekranda görüntüleyin.
  • harfler dosyasındaki 15. satırdaki harfi bulunuz.

less komutu

Geçerli dizinde bulunan dosyaların interaktif şekilde görüntülenmesini sağlar. Ok tuşları ile ekran kaydırılabilir, > tuşu ile dosya sonuna, < tuşuyla dosyanın başına gidilebilir. Ayrıca, dosya içinde arama yapmak da mümkündür. Açılan ekrandan q tuşuna basılarak çıkış yapılır.

  • less <dosya.adı> : Geçerli klasördeki <dosya.adı> isimli dosya içinde yazılı olanları farklı bir bölümde görüntüler.
  • less -N <dosya.adı> : Dosya içeriğini satırlara numara vererek görüntüler.
  • less -R <dosya.adı> : Dosya içinde bulunan özel karakterlerin görüntülenmesini sağlar. Terminalde var olan renklerin korunması için kullanılabilir.

echo komutu

İstenilen yazıların ekrana basılmasını sağlar.

  • echo "yazı" : Yazı ifadesinin ekrana basılmasını sağlar.

<<Şekil 2.14 echo komutunun kullanımı

rev komutu

İngilizce orijinal tarifi: "reverse lines of a file or files"

Dosya veya girdi içeriğindeki karakterleri ters sırada ekrana yazar.

  • rev <dosya.adı> : Geçerli klasörde bulunan <dosya.adı> isimli dosyanın içindeki satırların karakterlerini kendi içinde ters sırada ekranda görüntüler.

<<Şekil 2.15 rev komutunun kullanımı

Dosya türleri ve uzantıları (uyguluma)

Birinci bölümde açıklanan dosya türleri konusunu uygulamalı olarak anlamaya çalışalım. seq 1 10 komutu yardımıyla .png, .doc, .xls, .csv, ve .txt dosyaları oluşturunuz.

<<Şekil 2.15n Farklı türlerde dosya oluşturulması

Klasörünüzde önceden bulunan real.doc dosyası ile yeni oluşturduğunuz fake.doc adlı dosyayı hem Linux terminalinde hem de Windows işletim sisteminde karşılaştırınız (bunu xls, png, csv dosyaları için de tekrar ediniz)

Klasörünüzde bulunan real.svg dosyası scalable vector graphics adlı bir resim formatı olup, düzyazı (plain text) karakterleri kullanılarak resim çizdirme komutlarının özel bir XML formatı haline getirilmesiyle ortaya çıkar. Kısacası, doc, xls veya png gibi dosya türleri binary format olabildiği gibi, plain text formatında olan dosyalar ile de resim veya diğer tür formatlar türetilebilir.

Dosyaları Windows'ta açabilmek için winscp adlı program yardımıyla dosyaları uzaktaki makineden (remote) çalıştığınız makineye (local) taşımanız gerekmektedir. Winscp programının kurulumu için Ek-1'deki winscp hakkındaki bölüme bakınız.

Binary format dosyaların ekrana yazdırılması sırasında çıkan karakterler terminalin işleyişini bozabilir. Bu tür durumlarda reset yazarak enter tuşuna basınız.

tr komutu

İngilizce orijinal tarifi: "translate or delete characters"

Dosya içindeki veya girdideki karakterlerin başka karakterlere dönüştürülmesini sağlar. Diğer komutlar gibi tr <dosya.adı> şeklinde çalışmaz. Genellikle cat komutu ile birlikte işlev gösterir.

  • cat <dosya.adı> | tr <değiştirilecek.karakterler> <hedef.karakterler> : Geçerli klasörde bulunan <dosya.adı> isimli dosyanın içinde bulunan değiştirilecek karakterlerin hedef karakterlere dönüştürülmesini sağlar.
  • cat <dosya.adı> | tr -d "karakterler" : Geçerli klasörde bulunan <dosya.adı> isimli dosyanın içinde bulunan belirtilen karakterlerin silinmesini sağlar.

Boşluk, enter ve tab gibi özel karakterlerin de değiştirilmesi mümkündür. Boşluk için "", enter için \n ve tab için \t şeklinde ifadeler kullanılmalıdır.

<<Şekil 2.16 tr komutunun kullanımı

"ABCDEFGHJKLMNOPRSTUVYZ" şeklindeki karakter listesi [A-Z] şeklinde yazılabilir. Ayrıca, tr komutunda [:alpha:] , [:alnum:] gibi belirli karakter dizilerinin kısa gösterimleri kullanılabilir. Listenin tamamı için tr komutunun kullanma talimatını okuyunuz.

tr komutu ile karakter silme veya değiştirme yapılırken tekrarları ortadan kaldırmak (squeeze) ve tamamlayan küme (complement) özellikleri tek başına veya beraber kullanılabilir. Aşağıdaki örneklerde farklı tr özelliklerinin karıştırılarak nasıl beraber kullanılabileceği gösterilmiştir.

<<Şekil 2.16b tr komutunun delete, squeeze, complement özellikleri

Sorular

  • 'fark' kelimesinden 'pile' kelimesine kadar dört kademede olarak her kademede bir harf değiştirerek anlamlı kelimeler oluşturun. Örnek olarak kal kelimesinden sek kelimesine inmek şu şekilde gerçekleşir: kal - sal - sel - sek.
  • 'Yarın' kelimesini değiştirerek 'kadın' kelimesi olarak ekranda görüntüleyin.
  • AGTCAGCTACGACTACGACTACGACTAGCATCAA dizisinin ters eşleniğini (reverse complement) hesaplayınız.
  • seq ve tr komutlarını kullanarak yanyana 100 tane + işaretini yazdırınız (++++...). (İpucu: seq komutunun kullanım kılavuzuna bakınız)

%%%% TODO we should have plenty of tr questions for practicing

Dökümanların kelimelere ayrılması

Dökümanlara yönelik analizlerde (örn. Sentiment Analysis, döküman sınıflandırma, spam filtresi, otomatik özetleme), NLP çalışmalarında cümleleri simgelere ayırmak (ing. tokenization) ilk adımdır. Terminalde bu adım tr komutu ile yapılabilmektedir. Bir dökümandaki yabancı öğeler (noktalama işaretleri) ayıklanarak kelimeler sayılabilir, analiz edilebilir hale getirilir.

tr -d opsiyonu ile noktalama işaretleri ve sembolleri silmek aşağıdaki gibi mümkündür:

tr -d ".,:;!?/+-&%()"

Fakat böyle bir komutta, terminalde özel anlamı olan karakterler tr komutunun yanlış çalışmasına sebep olabilir. Bu yüzden tr komutu için tanımlanmış özel kümeleri kullanmak daha güvenli ve pratik olacaktır. Noktalama işaretleri için kullanılan küme [[:punct:]] şeklinde ifade edilebilir. Noktalama işaretlerinin silinmesi, dökümanda daha önce olmayan kelimeler ortaya çıkarıp yanlış hesap yapmaya sebep olabilir, bu yüzden noktalama işaretlerini silmek yerine boşluk karakteri ile yerdeğiştirmek daha doğru olacaktır.

Maalesef I'm, I've, I'd, Emma's gibi durumlarda noktalama işaretinin silinmesi ekstra harfler oluşturacaktır.

Birden fazla boşluk karakteri yanyana iken tek boşluk haline getirmek için tr -s (squeeze) opsiyonu kullanılabilir.

tr [[:punct:]] " " | tr -s " "

Kelimelerin sayılabilmesi için tek sütun haline getirmek, ayrıca büyük küçük harf farkından dolayı yanlış sayım yapmamak için, boşluk karakterini satır sonu karakteri ile yer değiştirip, büyük harfleri de küçük harfe çevirmeliyiz.

tr [[:punct:]] " " | tr -s " " | tr " " "\n" | tr A-Z a-z

Bütün bu işlemler çok daha pratik bir şekilde aşağıdaki komutla gerçekleştirilebilir.

tr -sc [A-Za-z] "\n" | tr A-Z a-z

Yukarıdaki komutları daha iyi anlayabilmek için adım adım örnek dosya üzerinde komutları inceleyelim. Örnek dosya adı cumle-noktalama olup içeriği aşağıdaki gibidir:

$ cat cumle-noktalama 
'Goodness gracious!  Is that you, Mr. Bumble, sir?' said Mrs. Mann, 
thrusting her head out of the window in well-affected ecstasies of 
joy. '(Susan, take Oliver and them two brats upstairs, and wash 'em
directly.)--My heart alive!  Mr. Bumble, how glad I am to see you, 
sure-ly!'

Bazı noktalama işaretlerinin terminalde özel manası olduğundan yanlış yorumlanabilir.

$ cat cumle-noktalama | tr -d ".,:;!?/+-&%()"
bash: !?/+-&%()": event not found

$ cat cumle-noktalama | tr -d '.,:;!?/+-&%()'
tr: range-endpoints of '+-&' are in reverse collating sequence order

[[:punct:]] kısayolu ile bütün noktalama işaretlerini silebilir veya değiştirebiliriz.

$ cat cumle-noktalama | tr -d [[:punct:]]
Goodness gracious  Is that you Mr Bumble sir said Mrs Mann 
thrusting her head out of the window in wellaffected ecstasies of 
joy Susan take Oliver and them two brats upstairs and wash em
directlyMy heart alive  Mr Bumble how glad I am to see you 
surely

Noktalama işaretlerini silmek bazı kelimeleri ve harfleri kaynaştırıp daha önce olmayan kelimeler ortaya çıkarabildiğinden boşluk karakteri ile yerdeğiştirmek daha güvenli olacaktır.

$ cat cumle-noktalama | tr [[:punct:]] " " 
 Goodness gracious   Is that you  Mr  Bumble  sir   said Mrs  Mann  
thrusting her head out of the window in well affected ecstasies of 
joy    Susan  take Oliver and them two brats upstairs  and wash  em
directly    My heart alive   Mr  Bumble  how glad I am to see you  
sure ly

Yanyana bulunan birçok boşluk karakteri tek bir boşluk karakterine dönüştürülebilir.

$ cat cumle-noktalama | tr [[:punct:]] " " | tr -s " "
 Goodness gracious Is that you Mr Bumble sir said Mrs Mann 
thrusting her head out of the window in well affected ecstasies of 
joy Susan take Oliver and them two brats upstairs and wash em
directly My heart alive Mr Bumble how glad I am to see you 
sure ly

Kelimelerin daha kolay sayılabilmesi için tek sütun haline getirmeliyiz, bunun da en pratik yolu boşluk karakterini \n yani satır sonu (Enter) karakteri ile yerdeğiştirmektir. (Çıktının sadece 5 satırı gösterilmiştir)

$ cat cumle-noktalama | tr [[:punct:]] " " | tr -s " " | tr " " "\n" | head -5

Goodness
gracious
Is
that

Kelime sayımının doğru olabilmesi için küçük harf ve büyük harf farkının ortadan kaldırılması gerekmektedir. Örneğin "You" ve "you" kelimelerinin ayrı ayrı sayılmaması gerekir.

$ cat cumle-noktalama | tr [[:punct:]] " " | tr -s " " | tr " " "\n" | tr A-Z a-z | head -5

goodness
gracious
is
that

tr komutunun farklı özelliklerini aynı anda kullanarak daha kısa komut yazabiliriz. tr -c opsiyonu tamamlayan küme manasında kullanılmaktadır. tr -c A-Za-z şeklindeki ifade büyük ve küçük harflerin dışında kalan bütün karakterler manasına denk gelir. Aşağıdaki komut çok pratik şekilde kelime ayırma ve saymaya hazır hale getirmek için kullanılabilir.

$ cat cumle-noktalama | tr -sc [A-Za-z] "\n" | tr A-Z a-z | head -5

goodness
gracious
is
that

İlerleyen sayfalarda sort ve uniq komutlarını öğrendikten sonra bir dökümanda kelimelerin kaç defa gözüktüğünü hesaplayacağız.

Kriptoloji ve Kriptoanaliz {#kriptoloji-intro}

Kriptoloji sayesinde herhangi bir mesaj belirli bir algoritma ile farklı bir hale dönüştürülüp güvenli olmayan kanaldan iletilebilir hale getirilmektedir. Bu tür dönüştürülmüş mesajlar üçüncü kişiler tarafından ele geçirilse çözümlenmesi gerekir (kriptoanaliz) ve kullanılan algoritmaya göre bu işlem basit veya çok zor olabilmektedir.

Aşağıda verilen şifreli mesaj üzerinden basit bir kriptoanalizin nasıl yapıldığını anlamaya çalışalım.

d rnxht vhrvck vkkxow fyvf v ovfy genbwkkne'k pwec bvpnedfw twkkwef dk gd.

Eğer yukarıdaki şifreli mesaj monoalfabetik yerdeğiştirme ile üretildi ise, yani her harf her seferinde sabit başka bir harfle yer değiştiriyorsa, şifrenin çözülmesi nispeten daha kolay olacaktır. Şifreli mesaj İngilizce dilinde olduğundan İngilizce kelimelere ait özellikler kullanılarak şifre çözülmeye çalışılmalıdır. Aşağıdaki tabloda harf ve kelime görülme sıklıkları listelenmiştir (kaynak). Ayrıca, Google Books projesinden ortaya çıkan Google N-Gram verisini (interaktif görüntülenebilir ve indirilebilir halleri mevcuttur) kelime ve harfler açısından değerlendiren sayfayı da ziyaret edebilirsiniz.

{title="Tablo 2.1a İngilizce diline ait kelime ve harf özellikleri"}

Özellik Liste
Tek harfli kelimeler I,a
Sık kullanılan iki harfli kelimeler of, to, in, it, is, be, as, at, so, we, he, by, or, on, do, if, me, my, up, an, go, no, us, am
Sık kullanılan üç harfli kelimeler the, and, for, are, but, not, you, all, any, can, had, her, was, one, our, out, day, get, has, him, his, how, man, new, now, old, see, two, way, who, boy, did, its, let, put, say, she, too, use
Sırasıyla en sık kullanılan harfler E T A O I N S H R D L U
Sırasıyla en sık kullanılan iki harfler (digraph) th er on an re he in ed nd ha at en es of or nt ea ti to it st io le is ou ar as de rt ve
Sırasıyla en çok karşılaşılan çift harfler ss ee tt ff ll mm oo
Sırasıyla kelime başında en sık kullanılan harfler T O A W B C D S F M R H I Y E G L N P U J K
Sırasıyla kelime sonunda en sık kullanılan harfler E S T D N R Y F L O G H A K M P U W

Şifreli mesajda tek harfli kelime olarak "d" ve "v" bulunmaktadır. O halde bu iki harf ya "a" ya da "i" harflerine denk düşmektedir. Tablodaki karakteristik özelliklere göre harflerin karşılıkları bulunduğunda aşağıdaki eşleşme tablosu ortaya çıkar:

Input   bcdefghknoprtvwxy
Output  fyirtplsomvwdaeuh

Şifreli mesajda kelimelerin formları aynen korunduğundan dolayı, tek harfli kelimler veya üç harfli sık kullanılan kelimeleri saptamak kolay olmaktadır. Bu yüzden, şifrenin çözülmesini zorlaştırmak için, kelimelerin sınırları belirli olmayacak hale getirilmelidir:

drnxh tvhrv ckvkk xowfy vfvov fygen bwkkn ekpwe cbvpn edfwt wkkwe fdkgd

Alfebedeki harfler 26! sayısında permütasyonlar ile a-z arası harflerle eşleştirilebilir.

Oldukça eski ve ilkel bir yöntem olan Sezar şifresi, her bir karakterin alfabetik olarak belirli ve sabit sayıda kaydırılması ile yapılmaktadır. Eğer, üç harf kaydırma kullanılacak olursa "Zebra" kelimesi "Cheud" şekline dönüşmektedir. ROT13 adlı şifreleme, Sezar şefrelemesinin özel bir hali olup her karakter alfabetik olarak 13 karakter ilerletilmektedir. ROT kısaltması rotation kelimesinden gelmektedir yani alfabede bulunun harflerin, onlara belirli uzaklıktaki harflerle yer değiştirmesidir.ROT13 kullanıldığında "Zebra" kelimesi "Mroen" şeklinde yazılmaktadır. "Zebra" kelimesini ROT13 ile "Mroen" şifresine dönüştürmek için komut kısmına echo Zebra | tr a-zA-Z n-za-mN-ZA-M yazılmalı, "Mroen" şifresini de ROT13 ile çözmek için komut satırına echo Mroen | tr n-za-mN-ZA-M yazılmalıdır.

ROT1             Şifreleme                    Deşifreleme
Input    ABCDEFGHIJKLMNOPQRSTUVWXYZ   ABCDEFGHIJKLMNOPQRSTUVWXYZ
Output   BCDEFGHIJKLMNOPQRSTUVWXYZA   ZABCDEFGHIJKLMNOPQRSTUVWXY

ROT13
Input    ABCDEFGHIJKLMNOPQRSTUVWXYZ   ABCDEFGHIJKLMNOPQRSTUVWXYZ
Output   NOPQRSTUVWXYZABCDEFGHIJKLM   NOPQRSTUVWXYZABCDEFGHIJKLM

ROT25
Input    ABCDEFGHIJKLMNOPQRSTUVWXYZ   ABCDEFGHIJKLMNOPQRSTUVWXYZ
Output   ZABCDEFGHIJKLMNOPQRSTUVWXY   BCDEFGHIJKLMNOPQRSTUVWXYZA

ROT13, diğer anahtarlara göre özel bir yere sahiptir çünkü ROT13 için hem şifreleme hem de sifre çözme işlemi aynı anahtarla yapılmaktadır. Bu yüzden diğer anahtarlara göre çok daha yaygın olarak kullanılmaktadır.

Sezar şifresi çok kolaylıkla çözülebilir çünkü 25 farklı anahtar deneyerek sonuca ulaşılabilir (ROT1 -- > ROT25). Terminalde bunun güzel bir örneği bu sayfada gösterilmiştir. Decrypting Text adlı websayfasında, kutuya yazılan yazı 25 farklı kaydırma ile denenip deşifre edilmektedir. Harfleri rastgele karıştırmak mümkün olsa da, sırası unutulmayacak bir karıştırma daha çok tercih edilmektedir. Bunun için kullanılan yöntemlerden biri, anahtar kelime kullanmaktır. Aşağıdaki eşleşme tablosu LINUX kelimesi kullanılarak oluşturulmuştur. Anahtar kelime ilk önce yazılmış ardından da anahtar kelimede olmayan harfler sırasıyla yazılmıştır. "Y" ve "Z" harflerinin yerleri değiştirilmiştir çünkü eşleşme tablosunda hiçbir harf kendiyle eşleşmemelidir.

Input   ABCDEFGHIJKLMNOPQRSTUVWXYZ
Output  LINUXABCDEFGHJKMOPQRSTVWZY

Böyle bir durumda şifrelenmiş yazıda harflerin frekansını inceleyip eşleşme tablosu tahmin edilmeye çalışılabilir. sort ve uniq komutlarını öğrendikten sonra bu tür analizin nasıl yapıldığına dair örnekler göreceksiniz.

Polialfabetik şifreleme, monoalfabetik yöntemlere göre çözümlemesi çok zor bir tekniktir. Bir harf, birden fazla karaktere eşlendiğinden dolayı yukarıda anlatılan tekniklerin hiçbirisi işe yaramayacaktır. En ünlü polialfabetik şifreleme 2. Dünya Savaşı sırasında kullanılan Enigma makinesidir. Bu makinenin nasıl çalıştığına dair videoyu ve deşifre edilmesinde kullanılan kusuru anlatan videoları izleyebilirsiniz.

Sorular

  • HELLO kelimesini ROT1 ile şifreleyin.
  • ROT1 ile şifrelenmiş MJOVY SPDLT mesajını çözümleyiniz.
  • HELLO kelimesini ROT13 ile şifreleyin.
  • ROT13 ile şifrelenmiş YVAHK EBPXF mesajını çözümleyiniz.
  • Hello World ifadesini ROT13 ile şifreleyiniz.
  • gizli_mesaj adlı dosyadaki şifreyi, yukarıdaki örnekte verilen eşleşme tablosuna göre çözümleyiniz.
  • data analysis and visualization ifadesini ZEBRA kelimesini anahtar kullanarak şifreleyiniz.
  • Obfuscation örneği olan komutun çıktısını irdeleyiniz: echo wftedskaebjgdBstbdbsmnjgz | tr "a-z" 'oh, turtleneck Phrase Jar!'

MD5 digest ve SHAsum

Bir websayfasından indireceğimiz veya emaille gelen bir dosyanın gerçekten de yazarı tarafından oluşturulmuş dosya olup olmadığından emin olmak için kullanılan yöntemler vardır. Bunlardan en basiti ve en yaygın olanı dosya ile beraber MD5 digest veya SHAsum değerlerini de yayınlamaktır. Elde ettiğimiz dosyada her hangi bir gizli değiştirme olup olmadığını dosya üzerinde MD5 veya SHA hesabı yaparak anlayabiliriz. Dosyada tek bir bit veya karakter değiştiğinde MD5 ve SHA değerleri tamamen değişmektedir.

3,147,289,058 karakterden oluşan insan genomu dosyası (hg19.fa) ile tek bir mutan taşıyan dosya (hg19_mutant.fa) arasında sadece karakterlik fark vardır, 168. satırda üçüncü A, G ile yer değiştirmiştir.

   $ diff hg19.fa hg19_mutant.fa 
   168c168
   < NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNTAACCCTAACCCTAACCCTA
   ---
   > NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNTAACCCTGACCCTAACCCTA

İki dosya için SHAsum hesaplandığında çok farklı değerler bulunmaktadır:

   $ sha256sum hg19.fa
   492c8d6337990dd017b065abb4559509e0853521976868c57dc6634d1d1796d7  hg19.fa
   
   $ sha256sum hg19_mutant.fa
   b8145a245624395c7d41671d8ed3d4a1afd3032ac9a5ff37e23ced3c3898fa60  hg19_mutant.fa

sort komutu

İngilizce orijinal tarifi: "sort lines of text files"

Geçerli dizinde bulunan bir dosyanın içeriğinin alfabetik olarak sıralanmasını sağlar.

  • sort <dosya.adı> : Klasörde bulunan <dosya.adı> isimli dosyanın sıralanması sağlar.
  • sort -r <dosya.adı> : Sıralamanın tersine çevrilmesi sağlar.
  • sort -n <dosya.adı> : Sıralamanın sayısal değerlere göre yapılması sağlar.
  • sort -k<kolon.numarası> <dosya.adı> : Sıralamanın belirlenen kolona göre yapılması sağlar.
  • sort -u <dosya.adı> : Sıralamayı yaparken birden fazla olan modellerin bir kere gösterilmesini sağlar.
  • sort -t 'ayrac.turu' <dosya.adı> : Sıralama yaparken <dosya.adı> isimli dosyanın kolonlarını 'ayrac.turu' ne göre belirler.

<<Şekil 2.17 sort komutunun kullanımı

<<Şekil 2.18 sort komutunun kullanımı (devamı)

Kitaptaki örneklerde çıktının daha düzgün görünmesi için column -t komutu eklenmektedir. Çıktının düzeni önemli değilse column -t komutunun kullanılmasına gerek yoktur.

Her ne kadar sort komutunun sayısal sıralama özelliği olsa da, sayıları alfabetik olarak sıralamak da mümkündür. Sayılara sıfır ile soldan dolgu yapılırsa, alfabetik olarak sıralanabilir hale gelirler.

<<Şekil 2.19 seq ve sort komutlarının birlikte farklı kullanımları

sort komutu aksi belirtilmedikçe bütün satırı değerlendirerek sıralama yapar, satırdaki karakterler sırasıyla karşılaştırılırlar. Bu durum, "ilk sütuna göre sıralama yapıldı" şeklinde yorumlanabilir. Aşağıdaki örnek, bütün satıra göre sıralamak ile ilk sütuna göre sıralamak arasında fark olduğunu göstermektedir. Ayrıca kolonların nasıl belirleneceği kullanıcıya aittir, kullanıcı herhangi bir kolon ayıracı belirtmemişse boşluk veya tab karakteri ayıraç olarak kullanılır. Aşağıdaki örnekte kolon ayıracı olarak f karakteri kullanıldığında sonuçların nasıl değiştiğini gözlemleyiniz.

$ echo -e "ab defgh\nabc efjk\na zcefhi"
ab defgh
abc efjk
a zcefhi

$ echo -e "ab defgh\nabc efjk\na zcefhi" > sort-test

$ sort sort-test                  | $ sort -t'f' sort-test
abc efjk                          | abc efjk
ab defgh                          | ab defgh
a zcefhi                          | a zcefhi
                                  |
$ sort -k1,1 sort-test            | $ sort -t'f' -k1,1 sort-test
a zcefhi                          | abc efjk
ab defgh                          | ab defgh
abc efjk                          | a zcefhi
                                  |
$ sort -k2 sort-test              | $ sort -t'f' -k2 sort-test
ab defgh                          | ab defgh
abc efjk                          | a zcefhi
a zcefhi                          | abc efjk

sort komutu aynı anda iki sütuna göre sıralama yapabilir. Aşağıdaki örnekte, filmler yıllara göre ters olarak (yeni çekilen filmler) ve ardından alfabetik olarak sıralanmışlardır. sort -k3r movies | sort -k2 şeklindeki komut yanlış sonuç verecektir çünkü üçüncü kolona göre sıralanan içerik ikinci kolona göre sıralanacaktır ve bu sırada ilk sıralama kaybolacaktır.

<<Şekil 2.19b İki sütuna göre aynı anda sıralama örneği

column komutu pipe içerisinde kullanırsa ardından gelen komutların doğru çalışmasını engeller, ardından gelen komutların sütunları algılayıp ayırabilmesine mani olur. Bu yüzden, görsel olarak düzeltme gerekmedikçe column komutunu kullanmamaya özen gösteriniz. Aşağıdaki örnek, tab karakterinin özel bir karakter olduğunu vurgulayıp, column -t ile boşluklara çevrildiğini, bunun ardından da artık kolon ayıracının ortadan kalktığını göstermektedir.

$ cat what-is-tab.txt            | $ column -t what-is-tab.txt
abc     3                        | abc               3
abcde   5                        | abcde             5
abcdefg 7                        | abcdefg           7
abcdefgh        8                | abcdefgh          8
abcdefghijklmnop        16       | abcdefghijklmnop  16
                                 |
$ cat -A what-is-tab.txt         | $ column -t what-is-tab.txt | cat -A
abc^I3$                          | abc               3$
abcde^I5$                        | abcde             5$
abcdefg^I7$                      | abcdefg           7$
abcdefgh^I8$                     | abcdefgh          8$
abcdefghijklmnop^I16$            | abcdefghijklmnop  16$
                                 | 
$ cut -f2 what-is-tab.txt        | $ column -t what-is-tab.txt | cut -f2
3                                | abc               3
5                                | abcde             5
7                                | abcdefg           7
8                                | abcdefgh          8
16                               | abcdefghijklmnop  16

Sorular

  • sayi50 dosyasını alfabetik olarak sıralayın.
  • sayi50 dosyasını sayısal olarak sıralayın ve ilk 15 tanesini ekranda görüntüleyin.
  • sayi50 dosyasının alfabetik sıralamaya göre son 25 tanesi hariç ekranda görüntüleyin.
  • english_words adlı dosyadaki kelimeleri kafiye oluşturacak şekilde sıralayın.
  • Ecoli-genome.fa adlı dosyadaki dizileri 20. nükleotide göre sıralayın.

cut komutu

İngilizce orijinal tarifi: "remove sections from each line of files"

Geçerli dizindeki bir dosya ya da girdinin içeriğinden istenen bölümlerin alınmasını sağlar.

  • cut -f<sayı> <dosya.adı> : Dosya içindeki, sayı ile belirlenen kolonların kesilip alınmasını sağlar.
  • cut -c<sayı> <dosya.adı> : Dosya içindeki sayı ile belirtilen karakterlerin kesilip alınmasını sağlar.
  • cut -d'<karakter>' <dosya.adı> : Dosya içinde bulunan sütunların belirtilen <karakter> ile ayrıldığını belirtmek için kullanılır. Tek başına bir fonksiyonu yoktur. Komutun hangi bölgeleri kesip görüntülemesi isteniyorsa belirtilmelidir. Komut satırına yazılan <karakter>in terminal de farklı bir anlamı olabilir. Bu nedenle, komutun doğru çalışabilmesi için <karakter> tırnak işareti (' ') içinde yazılmalıdır. Bazı komutlar tek tırnak (') bazı komutlar ise çift tırnak ("") ile çalışmaya uygundur.
  • cut --complement <dosya.adı> : Dosya içindeki çağırılan karakter veya kolonlar dışındakilerin kesilip alınmasını sağlar. Tek başına bir fonksiyonu yoktur, diğer seçeneklerden biri ile, -f veya -c gibi, birlikte kullanılmalıdır.

<<Şekil 2.20 cut komutunun farklı kullanımları

%%%% TODO cut -d',' -f2 test ve tab replacement example should be destructed, better prepare small file with comma %%%% TODO export LC_ALL=C might be needed for sort

-f ve -c seçeneklerinde kullanılan <sayı> değişkeni için birinci bölümdeki sayı aralıkları hakkındaki açıklamalara bakınız.

%%%% WARNING mysteriously code above might not be included in text please make sure it's included

Sorular

  • Movies ve ratings dosyalarındaki çift numaralı sütunları ekranda görüntüleyin.
  • Movies ve ratings dosyalarının üçüncü sütunları hariç ekranda görüntüleyin.
  • Movies ve ratings dosyalarındaki ikinci kolonların üçüncü harflerini ekranda görüntüleyin.
  • Movies dosyasındaki ikinci kolonda sondan ikinci harfleri ekranda görüntüleyin.
  • Movies dosyasında, toplam sütun sayısını bilmeden, son sütunu nasıl ekrana yazdırırız?
  • Movies ve ratings dosyalarındaki dördüncü kolonlarda yazılı olanları alfabetik sıralamaya göre üçüncü sırada olan kelimelerini bulup sadece ikinci ve dördüncü harflerini ekranda görüntüleyin.
  • Movies dosyasında her satır için 25. karakteri ekranda görüntüleyin. Boş satırların neden olduğunu açıklayın.

%%%% Bu soru çıkartıldı: Tek komut satırında movies dosyasının üçüncü sütunu ve ratings dosyasının ikinci sütunu hariç ekranda görüntüleyin. (Kitapta bulunmayan ek bir bilgi gerekmektedir)

uniq komutu

İngilizce orijinal tarifi: "report or omit repeated lines"

Geçerli dizinde bulunan dosya içindeki peş peşe dizilmiş aynı olan modelleri birleştirir ve sayılarını gösterir. Tek başına kullanılabildiği gibi, farklı bir komut ile birlikte de çalıştırılabilir. Böyle durumlarda sadece ilk komutun çalışabilmesi için <dosya.adı> belirlenmesi yeterlidir, uniq komutundan sonra tekrar <dosya.adı> yazılmasına gerek yoktur.

  • uniq <dosya.adı> : Geçerli dizindeki <dosya.adı> isimli dosya içinde peş peşe gelip aynı olan modelleri birleştirerek görüntüler.
  • uniq -c <dosya.adı> : Geçerli dizindeki <dosya.adı> isimli dosya içinde peş peşe gelip aynı olan modelleri birleştirerek ve yanlarında sayılarını vererek görüntüler.
  • uniq -d <dosya.adı> : Geçerli dizindeki <dosya.adı> isimli dosya içinde sadece peş peşe aynı gelen modelleri görüntüler.
  • uniq -f<sayı> <dosya.adı> : Geçerli dizindeki <dosya.adı> isimli dosya içinde peş peşe gelip aynı olan modelleri belirtilen sayıda kolondan sonraki kolona göre birleştirerek görüntüler.
  • uniq -s<sayı> <dosya.adı> : Geçerli dizindeki <dosya.adı> isimli dosya içinde sadece peş peşe gelip aynı olan modelleri belirtilen sayıda karakterden sonrasına göre birleştirerek görüntüler.

<<Şekil 2.21 cut ve uniq komutlarının kullanımı

sort komutunda olduğu gibi, uniq komutu da satır üzerinde çalışır. Ancak bütün satır aynıysa birleştirme yapabilir. Aşağıdaki örnekte bu özellik gösterilmiştir.

$ echo -e "a\t1\nb\t1\na\t1\nb\t1\na\t1\nc\t2"
a   1
b   1
a   1
b   1
a   1
c   2

$ echo -e "a\t1\nb\t1\na\t1\nb\t1\na\t1\nc\t2" | sort | uniq
a   1
b   1
c   2

$ echo -e "a\t1\nb\t1\na\t1\nb\t1\na\t1\nc\t2" | sort | uniq -c
      3 a   1
      2 b   1
      1 c   2

uniq komutu -f opsiyonu ile kolonlarda, -s opsiyonu ile de karakterlerde baştan verilen sayı kadar gözardı ederek işlem yapabilir. Kolon ayıracı olarak boşluk veya tab karakteri kabul edilir. Aşağıdaki örneklerde bu özellik gösterilmiştir.

$ echo -e "abc\ndbc\nefc"
abc
dbc
efc

$ echo -e "abc\ndbc\nefc" | uniq  -s1
abc
efc

$ echo -e "abc\ndbc\nefc" | uniq  -s2
abc

$ echo -e "a b c\nde b c\nf gh c"
a b c
de b c
f gh c

$ echo -e "a b c\nde b c\nf gh c" | uniq -f1
a b c
f gh c

$ echo -e "a b c\nde b c\nf gh c" | uniq -f2
a b c

$ echo -e "a b c\nde b c\nf gh c" | uniq -c -f2
      3 a b c

Sorular

  • emma ve oliver_twist kitaplarında en çok görünen 5 kelimeyi ayrı ayrı bulun. (cevap)
  • emma ve oliver_twist kitaplarında en çok bulunan 150. kelimeleri bulun.
  • emma kitabında kelime başında en çok bulunan 5 harf hangileridir? (Her farklı kelimeyi bir kere sayarak) (cevap)
  • emma kitabında kelime sonunda en çok bulunan 5 harf hangileridir? (Her farklı kelimeyi bir kere sayarak)
  • Ecoli-genome.fa dosyasında birden fazla bulunan iki diziyi bulunuz (Her satır ayrı bir dizi olarak düşünülmeli).
  • Movies dosyasından gerekli sütunu kullanarak, en çok film çekilen yılı bulunuz. (cevap)
  • Ratings dosyasında 4. kolon rating verilen gün ve saati gösterdiğine göre, en çok rating yapılan gün ve saat hangisidir (cevap)
  • Ratings dosyasında ilk kolon kullanıcı numarasını gösterdiğine göre, en çok puanlama yapan kullanıcı numarası nedir?
  • Ratings dosyasında ikinci kolon oylama yapılan filmin numarasını göstermektedir, bu halde en çok oy verilen filmin numarası nedir?
  • Ratings dosyasından gerekli sütunu kullanarak hangi puandan kaçar tane verildiğini bulunuz (örn. kaç tane 3.5 , 4 ve 4.5 puanları verilmiştir). (cevap)
  • Ratings dosyasından faydalanarak en çok oylama yapılan yılı bulunuz.
  • Ratings dosyasından faydalanarak en çok oylama yapılan saati bulunuz (Zamanı değil, HH:MM:SS bilgisinden saat, HH çekilip alınmalıdır).
  • movies dosyasında 2.kolon film adını, 3.kolon da yılını göstermektedir. İkinci kolonda birden fazla kere görünen film isimleri hangileridir? (farklı yıllarda aynı isimle çekilmiş filmler)
  • Sayı50 dosyasında hangi sayıdan kaç tane olduğunu ekranda görüntüleyin.
  • Harfler dosyasında hangi harften kaç tane olduğunu çoktan aza doğru gösteriniz.
  • Harfler dosyasında en çok bulunan harfi ekranda görüntüleyin.
  • Harfler dosyasında en çok bulunan beş harfi alfabetik sırayla ekranda görüntüleyin. (cevap)
  • Movies dosyasını son iki sütuna göre en çok sayıda görünen 10 kombinasyonu ekranda görüntüleyin. (cevap)
  • uniq -f ile baştan belirten sayı kadar kolon gözardı edilerek benzer satır araması yapıldığını görmüştük. echo -e "a b c\na d e\na f g" komutunun çıktısında son iki kolon gözardı edilerek benzerlik araması nasıl yapılabilir?
  • Ecoli-cds-protein dosyasındaki ikinci kolon E.coli genomundaki genlerin protein kodlayan dizilerini gösterdiğine göre, ATG'den sonra en çok kullanılan ikinci başlangıç kodonu hangisidir. (cevap)
  • Ecoli-cds-proteindosyasındaki genlerin protein kodlayan dizilerinde STOP CODON dağılımı nasıldır?
  • Ecoli-cds-protein dosyasındaki üçüncü kolon E.coli genomundaki genlerin protein dizilerini gösterdiğine göre, proteinlerin sonunda en çok gözüken 5 amino asidi bulunuz.

%%%% TODO birden fazla = uniq -d %%%% TODO some of the questions overlap with questions at the end of Chapter 2.. filter them (or these) out..

Sorularda kullanılan movies ve ratings dosyalarının içeriklerine dair açıklamalar bölüm sonundaki sorular kısmında açıklanmıştır. ratings dosyası boyut olarak fazla yer kapladığından, klasörünüzde şıkıştırılmış halde ratings.gz adıyla bulunabilir. gunzip ratings.gz komutuyla dosyayı açabilirsiniz. ratings dosyası 10 milyon satırdan oluştuğundan dolayı sort komutunun sonucunu almak için bir miktar beklemeniz gerekebilir.

Bakteri genomunda GC adaları

Genomun yapısını veya fonksiyonunu anlamak için çeşitli analiz yöntemleri vardır. GC nükleotidlerinin global veya lokal profilinin incelenmesi bunlardan biridir. Farklı organizmaların genomlarında farklı GC nükleotid oranları bulunmaktadır ve genom boyunca GC oranı yüksek bölgeler hatta adalar bulunmaktadır. Bu tür bölgeler patojenite veya transkripsiyon ile ilişkilendirilmektedir.

Şimdiye kadar öğrendiğimiz komutlar yardımıyla E.coli bakteri genomundaki GC adalarının uzunluklarının dağılımını analiz edelim. Genom dosyasının ilk on satırına bakıp dosya içeriği hakkında bilgi sahibi olalım.

Aşağıdaki örneklerde, dosyadan veya komut çıktılarından içeriğini anlamaya yetecek kadar satır, sadece 5 veya 10 satır, gösterilmiştir.

Fasta formatında olan genom dosyasının ilk satırından kurtulmak için tail komutu kullanılabilir. (Not: birden fazla kromozom olan dosyalarda bu yöntem kullanılamaz)

<<Genom dosyası içeriği

tr komutu yardımıyla G ve C nükleotidlerini alt çizgi ve A ile T nükleotidlerini boşluk karakteri ile yer değiştirdiğimizde aşağıdaki gibi bir sonuç elde etmekteyiz:

<<Genom dosyasında nükleotidlerin tr komutu ile yer değiştirilmesi

Bu işlemden sonra yanyana olan G ve C nükleotidlerinden oluşan GC adaları, terminalde görünür hale gelmiştir. Örneğin, 5 tane G ve C nükleotidi yanyana olan kısımlar (GGCCG, GCGCG, GGGCC gibi) 5 tane alt çizgi yanyana olarak görünecektir. Adaların uzunluklarına göre sıralamak için, adaların tek sütun haline getirmek gerekmektedir. Bunun için, yine tr komutu ile karakter değişikliği yapılacak, boşluk karakteri yeni satır (enter) karakteri ile yer değiştirilecektir. Böylelikle, her satırda sadece bir tane ada olacak şekilde çıktı düzenlenmiş olacaktır. Gereksiz yere boş satırlar üretmemek için tr komutu kullanılırken "-s" (squeeze) opsiyonu da eklenmiş yanyana olan boşluk karakterleri yapıştırılıp tek bir boşluk karakteri haline getirilmiştir.

<<GC adalarının tek sütun haline getirilmesi

Bundan sonra sort komutu ile benzer olan satırlar alt alta gelecek şekilde sıralanabilir.

<<GC adalarının sıralanmış tek sütun haline getirilmesi

Daha önceki örneklerde gördüğümüz üzere, bir sütunda bulunan öğelerin kaçar defa bulunduğu sort | uniq -c kombinasyonu ile hesaplanabilmektedir. 5 tane G ve C nükleotidi yanyana olan ada sayısı 48958 olarak bulunmuştur.

<<GC adalarının uzunluklarının dağılımı

Daha kesin hesap yapabilmek için:

  • Genom dosyasındaki ilk satırın gözardı edilmesi için kullandığımız tail -n +2 komutu birden fazla kromozom olan dosyalarda doğru sonuç vermeyecektir. İleriki bölümlerde öğrenecegimiz grep, sed veya awk komutları ile birden fazla kromozom bilgisini ortadan kaldırmak mümkün olacaktır.
  • Genom dosyası tek satır halinde olmayıp birçok satır halindedir, bu yüzden satır sonlarına gelen GC adaları ortadan bölünmektedir. Yine ek bir tr komutu sayesinde bu sorun aşılabilir ve bunun sonucunda daha doğru sonuç elde edilebilir (5 tane G ve C nükleotidi yanyana olan ada sayısı aslında 50292 tanedir).

Bu yönteme ait orijinal fikir Martin Krzywinski tarafından hazırlanan perl workshop içeriğinden alınmıştır.

fold komutu

Geçerli dizinde bulunan dosyaların içindeki bilgileri belirli yerlerden kırarak yeni satırlar oluşmasını sağlar. Tek başına fonksiyonu yoktur ve belirli seçeneklerle birlikte kullanılmalıdır.

  • fold -s : Dosyaların içindeki yazıları boşluk olan yerlerden kırar. Tek başına kullanıldığında bir fonksiyonu yoktur. Komutun farklı seçenekleri ile birlikte kullanılmalıdır.
  • fold -w<sayı> : Dosya içeriği veya çıktı belirtilen sayıda karakter uzunluğunda ekrana yazılır.

<<Şekil 2.22 echo ve fold komutlarının kullanımı

fold komutu ile ilgili sorular Frekans Analizi bölümünün sonunda bulunmaktadır.

Kriptoloji ve Kriptoanaliz - Frekans analizi

Bir önceki Kriptoloji bölümünde, Sezar şifresinin çok kolay kırılabildiğini, sadece 25 denemenin yeterli olacağını görmüştük. Fakat anahtar kelime kullanılarak yer değiştirme yapıldığında şifreyi çözmenin daha zor olacağını, 26! gibi bir ihtimal olduğundan, teker teker ihtimalleri deneyerek (brute force) çözmenin çok uzun zaman alacağını farketmiştik. Böyle bir durumda harflerin kullanım frekansından yardım alarak şifre çözülebilir.

İngilizce dilindeki metinler incelendiğinde aşağıdaki harf frekansı verisi ortaya çıkmaktadır.

{title="Tablo 2.1b İngilizce diline ait harf frekansları"}

a b c d e f g h i j k l m
8.2 1.5 2.8 4.3 12.7 2.2 2.0 6.1 7.0 0.2 0.8 4.0 2.4
n o p q r s t u v w x y z
6.7 7.5 1.9 0.1 6.0 6.3 9.1 2.8 1.0 2.4 0.2 2.0 0.1

Frekansa göre dizilmiş hali de şöyledir:

{title="Tablo 2.1c İngilizce diline ait harf frekansları - çoktan aza göre"}

e t a o i n s h r d l u c
12.7 9.1 8.2 7.5 7.0 6.7 6.3 6.1 6.0 4.3 4.0 2.8 2.8
m w f y g p b v k x j q z
2.4 2.4 2.2 2.0 2.0 1.9 1.5 1.0 0.8 0.2 0.2 0.1 0.1

Diğer dillerdeki harf frekanslarını tablo ve görsel olarak bu sayfada inceleyebilirsiniz. Ayrıca WordCreator(http://www.sttmedia.com/wordcreator) adlı yazılımın geliştiricileri tarafından birçok dildeki harf(http://www.sttmedia.com/characterfrequencies) ve hece(http://www.sttmedia.com/syllablefrequencies) analizi sayfaları da incelenebilir.

Terminalde tek harfi analizi yapmak oldukça kolaydır. fold -w1 komutu, herhangi bir metni tek harften oluşan bir sütun haline getirmektedir. Bunun ardından sort komutu ile benzer harfler alt alta getirilip uniq -c ile sayılabilir. Örnek olarak, cümle-noktalama dosyasındaki cümlenin harfleri aşağıdaki komutla sayılabilir:

cat cumle-noktalama | fold -w1 | sort | uniq -c

Noktalama işaretleri ve boşluk karakteri temizlendikten sonra daha temiz çıktı elde edilebilir.

Wikipedia Frekans Analizi sayfasında tek harf frekansı kullanılarak adım adım şifre çözümü örneği verilmiştir.

Tek harf frekansı bilgisine ek olarak, iki harflerin frekansı (bigram frequency) da şifre çözümünde yardımcı olabilmektedir. Bir metni fold -w2 ile katlayıp çiftleri saymak yeterli olmayacaktır çünkü ikinci çerçevedeki çiftler sayılamayacaktır. Bu yüzden metinde çift harf sayımı kayan pencere (sliding window) şeklinde sayılmalıdır. Örneğin, TERMINAL kelimesini fold -w2 TE RM IN AL şeklinde parçalar ama bigram sayımı için doğru parçalama şu şekilde olmalıdır: TE ER RM MI IN NA AL. Bu şekilde parçalamayı terminalde yine basit bir komuttan yardım alarak yapabiliriz. cut -c2- komutu, metni 2. karakterden itibaren gösterir, eğer bunu da fold -w2 komutu ile parçalarsak, her iki çerçevedeki bigramları toplamış oluruz.

$ echo TERMINAL | fold -w2
TE
RM
IN
AL

$ echo TERMINAL | cut -c2- |fold -w2
ER
MI
NA
L

Yukarıdaki bilgileri kullanarak Emma romanında çift harf sayımı yapmayı deneyiniz. (Sorular kısmında ikinci soru)

Tek harf, çift harf sayımına ek olarak, 3, 4, 5'li sayımlar yapılabilir. Bu analizlerin hepsine birden N-gram analizi denir.

Polialfabetik, transpozisyon veya Vinegre şifrelemeleri, eşit harf frekansı ortaya çıkardığından frekans analizi ile çözülmeleri mümkün değildir. Ayrıca harf frekansı dile göre metin içeriğine göre değişebilir. Örneğin, "z" harfi çok kullanıldığı halde, "zebra" konulu bir metinde oldukça çok sayıda "z" harfi bulunacaktır. Metne göre frekansın değişmesine örnek olarak 5. soru gösterilebilir.

%%%% TODO Info from Krypton Level 1 -> Level 2 and Krypton Level 2 -> Level 3 %%%% TODO find a sentence or paragraph showing standard etaoin..kxjqz distribution

Sorular

  • Emma ve Oliver Twist romanlarındaki tek harf frekanslarını hesaplayınız.
  • Emma ve Oliver Twist romanlarındaki çift harf frekanslarını hesaplayınız.
  • E.coli genomundaki nükleotid ve dinükleotid frekanslarını hesaplayınız.
  • "the quick brown fox jumps over the lazy dog" ifadesinin İngilizce dili açısından özelliği nedir?
  • Gadsby adlı romanın birinci bölümünü içeren gadsby_chp1.txt adlı dosyada hangi harf eksiktir?
  • Klasörünüzdeki gizli_mesaj2 adlı dosyadaki mesajı tek harf ve çift harf frekanslarını kullanarak çözünüz. (Not: Her bir harf çözümünü tr komutu ile büyük harf ile gösterirseniz, terminalde çözmeniz kolaylaşacaktır)
  • Oliver Twist kitabında toplam kaç karakter (tüm harfler ve noktalama işaretleri) kullanıldığını bulun ve bunların kullanım sayılarını ekranda görüntüleyin.
  • Ecoli-cds-protein dosyasındaki üçüncü kolon E.coli genomundaki genlerin protein dizilerini gösterdiğine göre, E.coli proteinlerindeki amino asit frekanslarını hesaplayınız (hangi amino asit kaç kere kullanılmıştır). Çıkan sonuç, bu konuyla ilgili bilimsel makaledeki bilgiyle örtüşüyor mu?
  • E.coli genomundaki en uzun kodlama bölgesine sahip yeeJ geninin (Ecoli-cds-protein dosyasında 3277. satır) kodon frekansını hesaplayınız (her bir kodon kaçar defa kullanılmıştır)
  • E.coli genomundaki en uzun kodlama bölgesine sahip yeeJ geninin (Ecoli-cds-protein dosyasında 3277. satır) +2, +3 çerçeveleri ve -1, -2 -3 çerçevelerinde en çok kullanılan kodonlar hangileridir. (6 çerçeve hakkında bilgi için ilgili linke bakınız)

%%%% TODO add a question, in which, the text is cyphered with zombie. however, the text should have good etaoin distribution.

Genomda kelime sayımı

%%%% TODO importance of k-mer frequency in genomics and other sciences

K-mer frequency analysis can be used as a general and assembly-independent method for estimating genomic characteristics, which can improve understanding of a species genome, help design the sequencing strategy of genome projects, and guide the development of assembly algorithms.Kaynak

Metod olarak, k-mer oluştururken genomun nasıl bölüneceği önemlidir. Örtüşen (overlapping) ve örtüşmeyen (non-overlapping) pencereler şeklinde bölünüp sayım yapıldığında farklı sonuçlar çıkacaktır. Aşağıdaki şekilde, pencere boyutu (3-mer veya 4-mer) ve pencerelerin örtüşüp örtüşmemesi durumları tarif edilmiştir.

Şekil 2.22b Kelime sayımında pencere şeçimini göre sayım sonuçlarının değişmesi

Örtüşmeyen sayım tek bir fold komutu ile yapılabilir. Ama örtüşen pencere sayımı için fold komutu birden fazla kere kullanılmalı ve her kullanımda genom dizisi bir harf eksiltilip çerçeve kayması sağlanmalıdır.

Terminal komutları yardımıyla genomda kelime sayımına dair örnek Martin Krzywinski tarafından hazırlanan perl workshop adlı çalışmanın ilgili PDF dosyasında bulunabilir.

Sorular

  • Genomda kelime sayımı için atıfta bulunulan dökümanın 7. sayfasındaki komutu E.coli genomu için uygulayıp genomda en çok bulunan 10 tane 7-mer'i bulunuz.

comm komutu

İngilizce orijinal tarifi: "compare two sorted files line by line"

Geçerli dizinde bulunan iki dosya arasındaki ortak satırların bulunmasını sağlar.

  • comm -1 -2 <dosya.adı1> <dosya.adı2> : Geçerli klasördeki <dosya.adı1> ve <dosya.adı2> isimli iki klasör arasındaki ortak olan model veya ortak olan satırların görüntülenmesini sağlar.
  • comm -2 -3 <dosya.adı1> <dosya.adı2> : Geçerli klasördeki <dosya.adı1> ve <dosya.adı2> dosyalarındaki satırlardan <dosya.adı2> de olmayıp sadece <dosya.adı1> de olanların görüntülenmesini sağlar.
  • comm -1 -3 <dosya.adı1> <dosya.adı2> : Geçerli klasördeki <dosya.adı1> ve <dosya.adı2> dosyalarındaki satırlardan <dosya.adı1> de olmayıp sadece <dosya.adı2> de olanların görüntülenmesini sağlar.

<<Şekil 2.23 comm komutunun kullanımı

Yukarıdaki örnekten comm komutunun tek sütun halindeki listenin ortak elemanlarını bulduğu sanılabilir. Aslında bütün satırın aynı olup olmadığını karşılaştırılmaktadır. Aşağıdaki örnekte birden fazla sütundan oluşan iki dosya arasında ortak olan satırlar bulunmuştur.

<<Şekil 2.23.1 comm komutunun satır bazında çalıştığını gösteren örnek

Girdi olarak iki dosya kabul eden komutlar için girdiler farklı şekilde sağlanabilir:

  1. Dosyalardan her ikisi de bilgisayarda kayıtlı dosya olabilir. Bu durumda, eğer sıralı dosya gerekiyorsa, dosyayı sıralayıp kaydetmek gerekmektedir.

  2. <( komut ) şeklinde sanal dosya olarak dosyalardan biri veya her ikisi de sağlanabilir. (Daha fazla bilgi için Process Substitution)

  3. Dosyalardan biri (ikisi birden değil) yerine tire (-) işareti kullanılıp bu dosya için girdi başka bir komuttan çubuk (|) yardımıyla alınabilir.

#1                              | #2 (dosyalardan biri veya ikisi)
$ sort set2 > set2-sorted       | $ comm -12 set1 <(sort set2)
$ comm -12 set1 set2-sorted     | 1                           
1                               | 3                           
3                               |
                                | $ comm -12 <(sort set1) <(sort set2)
#3                              | 1
$ sort set2 | comm -12 set1 -   | 3
1                               | 
3                               |

Sorular

  • Sayı50 ve sayı1000 dosyalarındaki ortak satırları bulun.
  • Sadece sayı1000'de olan satırları bulun.
  • Emma romanında ve Oliver Twist romanında ortak olarak bulunan ve alfabetik sıralamaya göre en sonda bulunan 5 kelimeyi bulun.
  • Oliver Twist romanında olup Emma romanında olmayan ve alfabetik sıralamaya göre ilk 5 kelimeyi bulun.
  • Emma romanında bulunup Oliver Twist romanında bulunmayan kelimelerin alfabetik sıralamaya göre 50. sırada olanını bulunuz.

paste komutu

İngilizce orijinal tarifi: "merge lines of files"

Geçerli klasördeki iki dosyanın içindekilerin tamamen birbiri üzerine yapıştırılmasını sağlar.

  • paste <dosya.adı1> <dosya.adı2> : Geçerli klasördeki <dosya.adı1> ve <dosya.adı2> isimli iki klasördeki bilgilerin değiştirilmeden, yan yana yapıştırılmasını sağlar.
  • paste <dosya.adı1> <dosya.adı2> -d'ayıraç' : Geçerli klasördeki <dosya.adı1> ve <dosya.adı2> isimli iki klasördeki bilgilerin değiştirilmeden, yan yana yapıştırılmasını ve berlirtilen ayıraç ile ayrılmasını sağlar. Bu komut ile peş peşe farklı ayıraçlar da yapılabilir.
  • paste <dosya.adı1> <dosya.adı2> -s : Geçerli klasördeki <dosya.adı1> ve <dosya.adı2> isimli iki klasördeki bilgilerin değiştirilmeden ama satırlar sütun, sütunlar satır yapılarak yapıştırılması sağlanır.

<<Şekil 2.24 paste komutunun farklı kullanımları

<<Şekil 2.24.1 paste komutuyla sayı serisi üretimi ve hesaplanması

Örnekteki "harf" veya "sayı" dosyaları kitapla gelen zip dosyasında mevcut değildir. İçeriklerinin sırasıyla 4 tane harf ve sayı içeren dosyalar olduğu varsayılabilir.

Sorular

  • Sayı50 ve harfler dosyalarını kolon ayıracı virgül (,) olarak birleştirin.
  • Sayı50 ve harfler dosyalarını seri halde birleştirin.
  • Sayı50 ve harfler dosyalarını birleştirip iki kolon haline getirin ve sayı.harf ismi ile ayrı bir dosya olarak kaydedin.
  • Sayı.harf dosyasında harflerin bulunduğu sütuna göre sıralamada ilk beş satırı ekranda görüntüleyin.
  • Harfler dosyasının alfabetik olarak sıralanmış halini sayı50 dosyası ile birleştirip 8. satırını ekranda görüntüleyin.
  • Sayı50 ve harfler dosyalarının seri olarak birleştirilmesi ile oluşan dosyanın 25, 28 ve 32. sütunlarını ekranda görüntüleyin.
  • Sayı50 ve harfler dosyalarını ayıracı yıldız (*) olacak şekilde birleştirip son 8 satırını ekranda görüntüleyin.
  • Sayı50 ve harfler dosyasının tek satır halinde birleştirilmesi ile oluşan listenin 175-180. sütunlarını tek satır halinde görüntüleyin.
  • Ecoli-cds-protein dosyasındaki CDS dizilerinden başlangıç kodonu ve bitiş kodonu çiftlerinin dağılımını hesaplayınız. (Cevap: ATG TAA 2425, ATG TGA 1043, vb.)

Bi-gram analizi

Kriptoanaliz ve genomda kelime sayımı konularında gördüğümüz N-gram kavramı sadece bir karakter dizisi içindeki harfleri veya belirli boyuttaki (örn. 3-mer) pencereleri incelemekte kullanılmıştı. Fakat, bu metod bir cümlenin kelimeleri için de uygulanabilir. Yanyana gözüken ikili kelimelerin analizi bi-gram (veya 2-gram), yanyana gözüken üçlü kelimelerin analizi de tri-gram analizi olarak adlandırılmaktadır. Google N-gram projesi, 8 milyondan fazla taranmış kitaptan 1-gram, 2-gram, 3-gram, 4-gram ve 5-gram verilerini oluşturmuştur.

%%%% TODO mention N-gram for DNA (http://www.biomedcentral.com/1471-2105/12/12 ) and find more examples for use of N-gram for other than DNA

Aşağıdaki örnek Emma romanında yanyana bulunan ikili kelimelerin (bi-gram) frakansını hesaplamaktadır.

cat emma.txt | tr -sc '[:alnum:]' '\n' | tr A-Z a-z  > emma.words
tail -n +2 emma.words > emma.nextwords
paste emma.words emma.nextwords | sort | uniq -c > emma.bigrams

Soru

Bu çalışmanın bir adım ötesi olan trigram analizini yapıp en çok bulunan trigramı bulunuz.

split komutu

Geçerli klasördeki dosyaların parçalara bölünmesini sağlar. Yeni parçalara verilecek isim belirtilmezse x diye atama yapılır ve sırasıyla; xaa, xab, xac, xad, xae ... şeklinde devam eder. Dosya ismi verilirse x yerine yazılarak aynı şekilde devam eder. Aynı klasör içinde birden fazla split komutu kullanılır ve yeni oluşacak dosyalar için isim belirlenmezse, her kullanımda bir önceki parçalar silinerek yeni parçalar tekrar xaa ismi ile başlayarak kaydedilir. Parça dosyalara verilecek isim komut satırının sonuna yazılır.

  • split<dosya.adı> isim : Geçerli klasörde bulunan <dosya.adı> dosyası tek parça halinde yeni bir dosya olarak kaydedilir ve adı isimaa olur.
  • split -l<sayı> <dosya.adı> isim : Geçerli klasörde bulunan <dosya.adı>, belirtilen sayı kadar satırlarda parçalara ayrılarak yeni dosyalar olarak kaydedilirler ve isimleri isimaa, isimab, isimac,... olur.
  • split -n<sayı> <dosya.adı> isim : Geçerli klasörde bulunan <dosya.adı> dosyası, belirtilen sayı kadar eşit parçalara bölünerek yeni dosyalar olarak kaydedilirler ve isimleri isimaa, isimab, isimac,... olur.

<<Şekil 2.25 split komutunun farklı kullanımları

Sorular

  • Sayı1000 dosyasını 13er satır olarak bölün.
  • Sayı50 dosyasını 10 eşit parçalaya bölün.
  • Harfler dosyasını, her dosya 8 satır olacak şekilde bölün ve oluşan dosyaların isimlerini 'parça' ile başlayacak şekilde ayarlayın.
  • Sayı50 ve harfler dosyalarını alfabetik olarak sıralanmış şekilde birleştirip her bir dosya 10 satır olacak şekilde bölün.
  • Split komutunu kullanarak sayı50 dosyasını kopyalayın.

join komutu

İngilizce orijinal tarifi: "join lines of two files on a common field"

Geçerli klasördeki iki dosyayı ortak kolonları üzerinden birleştirir. Ekstra bir seçenek belirtilmediği sürece, sadece ilk kolonu ortak olan satırları gösterir.

  • join <dosya.adı1> <dosya.adı2> : Geçerli klasördeki <dosya.adı1> ve <dosya.adı2> isimli klasörleri ilk kolondaki ortak olanlara göre yan yana yapıştırır.
  • join -1 <kolon.no1> -2 <kolon.no2> <dosya.adı1> <dosya.adı2> : Geçerli klasördeki <dosya.adı1> ve <dosya.adı2> isimli klasörleri birinci dosyanın <kolon.no1> kolonuna ikinci dosyanın da <kolon.no2> kolonuna göre birleştirilir.
  • join -a 1 <dosya.adı1> <dosya.adı2> : Geçerli klasördeki <dosya.adı1> ve <dosya.adı2> isimli klasörleri ilk kolondaki ortak olanlara göre yan yana yapıştırır ve birinci dosyada bulunan tüm satırları gösterir.
  • join -a 2 <dosya.adı1> <dosya.adı2> : Geçerli klasördeki <dosya.adı1> ve <dosya.adı2> isimli klasörleri ilk kolondaki ortak olanlara göre yan yana yapıştırır ve sadece ikinci dosyada olan satırları da gösterir.
  • join -v 1 <dosya.adı1> <dosya.adı2> : Geçerli klasördeki <dosya.adı1> ve <dosya.adı2> isimli klasörleri ilk kolondaki ortak olanlara göre inceleyerek ve ortak olmayıp sadece birinci dosyada olan satırları gösterir.
  • join -v 2 <dosya.adı1> <dosya.adı2> : Geçerli klasördeki <dosya.adı1> ve <dosya.adı2> isimli klasörleri ilk kolondaki ortak olanlara göre inceleyerek ve sadece ikinci dosyada olan satırları gösterir.
  • join -o dosya-no.kolon-no <dosya.adı1> <dosya.adı2> : Geçerli klasördeki <dosya.adı1> ve <dosya.adı2> isimli klasörleri ilk kolondaki ortak olanlara göre yan yana yapıştırır ve belirtilen dosyaların belirtilen kolonlarının görüntülenmesini sağlar.
  • join -e 'işaret' <dosya.adı1> <dosya.adı2> : Geçerli klasördeki <dosya.adı1> ve <dosya.adı2> isimli dosyalar birleştirildiğinde karışıklığı önlemek için, ortak olmayan kısımlara belirli işaretler konulmasını sağlar. Dosyalar sadece join ile birleştirildiğinde yalnızca ortak komutların satırları geldiği için e seçeneğinin bir fonksiyonu olmaz. Bu nedenle önce -a seçeneği ile hangi dosyada olmayan satır çağrılacaksa o belirtilmelidir.

join ve comm komutu için kullanılan dosyaların sort komutu ile sıralı hale getirilmiş olması gerekir. Özellikle join komutu için, hangi ortak kolon üzerinde birleştirme yapılacaksa her iki dosyanın da o kolona göre alfabetik sıralanması gerekmektedir. Dosyalar sıralanarak farklı birer dosya olarak kaydedilebilecekleri gibi aşağıdaki örnekte olduğu gibi de yapılabilir.

join <(sort öğrenci-not-dönem1) <(sort öğrenci-not-dönem2)

<<Şekil 2.26 join komutunun farklı kullanımları

Yukarıdaki örnek çıktıda, uzun satırların bir sonraki satıra taşan kısımları \ ile gösterilmiştir, komutlar çalıştırıldığında terminal ekranında görünmeyecektir.

Her iki kümedeki elemanlar birer defa bulunuyorsa comm -12 ve join komutları benzer sonuçlar verecek ve iki küme arasında "ortak" olan elemanları listeleyecektir. Fakat, bir kereden fazla görünen elemanlar olduğunda comm ve join komutlarının davranışları değişecektir.

Aşağıdaki örnekte tek sütun halindeki listelerin birleştirilmesinden sonra, join komutu "2" rakamını iki kere göstermiştir, sadece bir dosyada iki kere görüldüğü halde. comm komutu ise ortak olarak bir tane "2" rakamı olduğunu göstermiştir.

$ echo -e "1\n2\n2\n3" > setA
$ echo -e "2\n3\n4" > setB

$ cat setA                        | $ cat setB
1                                 | 2
2                                 | 3
2                                 | 4
3                                 | 

$ comm setA setB                  | $ join setA setB
1                                 | 2
                2                 | 2
2                                 | 3
                3                 | 
        4                         | 

Bu davranışın sebebi, join komutunun ortak eleman aramaması, iki listedeki her elemanı birbiriyle kavuşturmaya çalışmasıdır. Aşağıdaki örnek bu durumu iki sütunlu dosyaların birleştirilmesinde göstermektedir.

# jset1                      # jset2                # jset3
echo -e "1 ab\n2 cd\n2 ef" | echo -e "1 gh\n2 ij" | echo -e "2 kl\n2 mn"
1 ab                       | 1 gh                 | 2 kl 
2 cd                       | 2 ij                 | 2 mn
2 ef                       |                      |

$ join jset1 jset2         | $ join jset1 jset3   | $ join jset2 jset3
1 ab gh                    | 2 cd kl              | 2 ij kl
2 cd ij                    | 2 cd mn              | 2 ij mn
2 ef ij                    | 2 ef kl              |
                           | 2 ef mn              |

Bu yüzden, ortak eleman bulunması gerektiğinde doğru komutu kullanmak gerekmektedir.

Sıralı sütun gerektiren her iki komutu, comm ve join, kullanırken sonuçları ilk olarak head ile görüntülemeye çalışınız. Aksi takdirde, dosyaların sıralı olmadığına dair hata mesajını göremeyebilirsiniz.

Sorular

  • Emma ve Oliver Twist kitaplarında ortak olarak en çok görünen 5 kelimeyi bulun.
  • Emma romanında olup Oliver Twist romanında olmayan ve en çok sayıda bulunan ilk 5 kelimeyi bulun.
  • Sayı.harf dosyasında sadece bir kez görünen harfleri yanlarındaki sayılar ile birlikte ekranda görüntüleyin. asciicast
  • Ecoli-cds-protein dosyasında 2332. satırda bulunan satP genine ait CDS dizisinin codon-table adlı dosya yardımıyla kaçar tane Basic ve Acidic amino asit kodladığını bulunuz.
  • Aynı geni codon-table adlı dosya yardımıyla translasyona uğratınız. Çıktı MGNTKLANPAPLGLMGFG...* şeklinde olmalıdır. (Not: join sırasında codonların sırasını kaybetmemelisiniz!, ipucu: Schwartzian Transform)
  • Bir amino aside karşılık gelen birden fazla kodon olmasına rağmen (Codon Degeneracy) her kodon eşit ağırlıkta kullanılmamaktadır (Codon Bias). Ecoli-cds-protein dosyasındaki bütün kodonların amino asit karşılıklarını birleştirerek amino asitlerin kodon tercihlerini görüntüleyiniz. (Örn; Pro için CCG, Leu için CTG, Stop Codon için TAA ağırlıklı olarak kullanılmıştır. E.coli için bütün tablo.)

%%%% TODO wc command can be mentioned earlier

wc komutu

Geçerli klasördeki dosyaların veya girdideki satır, kelime ve karakter sayımını gerçekleştirir.

  • wc <dosya.adı> : Geçerli klasördeki <dosya.adı> isimli dosya için sırasıyla; satır, kelime ve karakter sayılarını gösterir.
  • wc -l <dosya.adı> : Geçerli klasördeki <dosya.adı> isimli dosya için toplam satır sayısını ve dosya adını gösterir. Sadece satır sayısı gösterimi için çok tercih edilen kullanımı; cat <dosya.adı> | wc -l şeklindedir. Bir çok farklı sayım için oldukça yaygın olarak kullanılır.
  • wc -w <dosya.adı> : Geçerli klasördeki <dosya.adı> isimli dosya için sadece kelime sayısını gösterir.

Birçok komut için kullanılan <dosya.adı> ifadesi birden çok dosya da içerebilir, jokerler sayesinde. Daha detaylı bilgi için jokerler açıklamasına bakınız.

<<Şekil 2.27 wc komutunun kullanımı

Sorular

  • Kitap1 ve kitap2'de kitapta bulunma sayısına göre sıralamada ortada olan kelime veya kelimeleri ayrı ayrı bulun.
  • Oliver twist kitabında toplam kaç kelime olduğunu bulun. (C: 166675)
  • Oliver Twist ve Emma kitapları arasında kaç karakter fark olduğunu bulun. (C: 4) asciicast
  • Oliver Twist ve Emma kitapları arasında toplam kaç harf fark olduğunu bulun. (C: 13657)
  • Emma kitabında toplam kaç cümle olduğunu bulun. (C: 10568)

%%%% TODO the numbers do not match with anticipated results. do them again.

grep,egrep komutu

İngilizce orijinal tarifi: "print lines matching a pattern"

Geçerli klasördeki dosya içindeki motiflerin bulunmasını sağlar.

  • grep 'motif' <dosya.adı> : Geçerli klasördeki <dosya.adı> isimli dosya içinde belirtilen motifin bulunduğu satırları görüntüler.
  • grep -f 'motif' <dosya.adı1><dosya.adı2> : Geçerli klasördeki <dosya.adı1> isimli dosya içinde belirtilen motiflerin <dosya.adı2> isimli klasörde bulunan satırları görüntüler. <dosya.adı1> isimli dosya içindeki tüm motifler aranır. Aynı dosya için grep komutunu aynı anda birkaç kez kullanmak gibi düşünülebilir.
  • grep -v 'motif' <dosya.adı> : Geçerli klasördeki <dosya.adı> isimli dosya içinde belirtilen motifi içermeyen satırları görüntüler.
  • grep -w 'motif' <dosya.adı> : Geçerli klasördeki <dosya.adı> isimli dosya içinde belirtilen motifin bulunduğu satırları görüntüler. grep komutundan farklı olarak tamamen aynı motif aranır. Örneğin motif eğer alp ise alperen ya da gökalp gibi olanlar görüntülenmez.
  • grep -c 'motif' <dosya.adı> : Geçerli klasördeki <dosya.adı> isimli dosya içinde belirtilen motifin bulunduğu satırların sayısını görüntüler.
  • grep -o 'motif' <dosya.adı> : Geçerli klasördeki <dosya.adı> isimli dosya içinde belirtilen motifin bulunduğu satırların sadece motiflerini görüntüler. Örneğin satırdaki kelime şener şen ise; şen şen şeklinde sayım gerçekleşir. Bu sayede aranan motiften aynı satırda birden fazla varsa, bunlar da sayılmış olur.
  • grep -n 'motif' <dosya.adı> : Geçerli klasördeki <dosya.adı> isimli dosya içinde belirtilen motifin bulunduğu satırları ve satır numaralarını görüntüler.
  • grep -A<sayı>'motif' <dosya.adı> : Geçerli klasördeki <dosya.adı> isimli dosya içinde belirtilen motifin bulunduğu satırdan belirtilen sayı kadar sonraki satırı görüntüler.
  • grep -B<sayı>'motif' <dosya.adı> : Geçerli klasördeki <dosya.adı> isimli dosya içinde belirtilen motifin bulunduğu satırdan belirtilen sayı kadar önceki satırı görüntüler. Motifin bulunduğu satır ve belirtilene göre öncesinde ya da sonrasında belirli miktarda görüntülenen satırlarda karışıklık olmaması için satır aralarına -- ayıracı konularak ekranda görüntülenir.

Grep komutu ile aranan motiflerin, tüm satırların görüntülendiği durumlarda kolaylıkla bulunabilmesi için renkli olması büyük avantaj sağlar. Bu, komut satırı eksiksiz yazılıp sonuna --colour yazılarak yapılabilir. Kitaptaki çıktılarda renkler görünmediğinden ilgili asciicast videosunu izleyiniz.

Grep komutunun yetersiz kaldığı ve çalışmadığı bazı durumlar da egrep komutu kullanılabilir. İki komut da tamamen aynıdır fakat egrep komutu grep komutunun biraz geliştirilmiş versiyonu şeklinde tanımlanabilir. Karmaşık aramalar yapılırken egrep komutunun kullanılması daha doğru sonuç verebilir.

<<Şekil 2.28 grep komutunun kullanımı

Regular Expressions (Kurallı İfadeler)

  • . : Herhangi bir karakteri ifade eder.
  • <karakter>* : Belirtilen karakterin sıfır veya sıfırdan fazla görünmesini ifade eder.
  • <karakter>+ : Belirtilen karakterin en az bir kez görünmesini ifade eder.
  • <karakter>{<sayı1,sayı2>} : Belirtilen <karakter>in minimum <sayı1>, maksimum <sayı2> kadar görüntülenmesini ifade eder.
  • [<karakter>] : Belirtilen <karakter>lerden herhangi birinin, bir kere görünmesini ifade eder. Birden fazla karakter yazılacağı zaman aralara virgül (,) veya boşluk ( ) koyulmamalıdır. Bu gibi durumlarda virgül (,) ve boşluk ( ) karakterini de belirtilen dosya içerisinde ve kural da arar.
  • (<motif>) : Belirtilen <motif>in bir bütün olarak görünmesini ifade eder. Birden fazla motif aranacaksa çubuk ( | ) karakteri kullanılmalıdır. Örneğin (motif1|motif2) ifadesi motif1 ve motif2 ifadelerinin aranmasını sağlar.
  • <karakter>$ : Belirtilen <karakter>in satır sonlarında aranmasını sağlar.
  • ^<karakter> : Belirtilen karakterin satır başlarında aranmasını sağlar.

<<Şekil 2.29 egrep komutunun kurallı ifadeler ile farklı kullanımları

Kitaptaki çıktılarda renkler görünmediğinden ilgili asciicast videosunu izleyiniz.

egrep for linguists adlı dökümanda grep ile ilgili (ve tr, cut gibi komutlarla ilgili) detaylı açıklamalar ve örnekler bulabilirsiniz.

Sorular

  • Emma adlı kitapta kaç tane büyük harfli kelime vardır? (örn. ÖRNEK)
  • Emma adlı kitapta kaç tane 4 harfli kelime vardır?
  • Emma adlı kitapta kaç tane tek heceli (sadece bir tane sesli harf içeren) kelime vardır?
  • Emma adlı kitapta en çok kullanılan ilk 10 kelimeyi, İngilizce'de çok kullanılan kelimeleri (stop words) çıkartarak tekrar hesaplayınız. (stop_words adlı dosyada çok kullanılan kelimelerin listesi mevcuttur)
  • Emma adlı kitapta bi-gram sayımını, İngilizce'de çok kullanılan kelimeleri çıkartarak tekrar hesaplayınız.

%%%% TODO we can carry regex topic after awk and include a table showing diffs between regex of grep sed and awk, idea for table is here: http://www.sqlite.org/src/artifact/af92cdaa5058fcec

%%%% TODO add tweet example and then ask for popular hashtag (both tr and grep needs #) for example: tr -sc '[:alnum:]@#'' '\n'

sed komutu

İngilizce orijinal tarifi: "stream editor for filtering and transforming text"

Geçerli klasörde bulunan dosyalar için veri akışı sırasında karakter ve/veya motiflerin düzenlenerek filtreleme ve dönüştürme yapılmasını sağlar. Dosyanın nano komutu ile açılmadan istenilen satırın silinmesini veya farklı satır eklenmesini sağlar. sed '1,5'd komutu belirtilen dosyanın ilk beş satırının silinmesini, sed '$d’ ise belirtilen dosyanın son satırının silinmesini sağlar.

  • sed -e 's/<değişecek.motif>/<hedef.motif>/' <dosya.adı> : Geçerli klasör içindeki <dosya.adı> isimli dosyadaki <değişecek.motif> ile belirtilen motiflerin <hedef.motif>e dönüştürülmesini sağlar. Burada <değiştirilecek.motif> bulunan her satırda ilk motif değiştirilerek tüm dosya ekranda görüntülenir.Genellikle komutun tüm kullanımlarında -e seçeneği yazılır.
  • sed -e 's/<değişecek.motif>/<hedef.motif>/g'<dosya.adı> : Geçerli klasördeki dosyada motif bulunan satırlarda sadece ilk motifin değil tüm motiflerin değiştirilmesini sağlar. Tek başına bir fonksiyonu yoktur. Komutun diğer seçenekleri ile birlikte kullanılmalıdır.
  • sed -e 's/<değişecek.motif>/<hedef.motif>/' -i <dosya.adı> : Geçerli klasör içindeki <dosya.adı> isimli dosyadaki <değişecek.motif> ile belirtilen motiflerin <hedef.motif>e dönüştürülmesini ve kaydedilmesini sağlar. Burada -i seçeneği yerinde değişimin gerçekleştirilmesinde görevlidir.Satırda bulunan ilk motif değişirken diğerleri sabit kalır.
  • sed -e 's/<değişecek.motif>/<hedef.motif>/' -i.<isim> <dosya.adı> : Bu kullanımda ise tek fark orijinal dosyanın dosya.adı.<isim> şeklinde yeni bir dosya olarak kopyalanmasını ve saklanmasını sağlamaktır.
  • sed -n '/<aranan.motif>/p' <dosya.adı> : Geçerli klasör içindeki <dosya.adı> isimli dosyada sadece <aranan.motif>i içeren satırların ekranda görüntülenmesini sağlar.
  • sed -e '/<aranan.motif>/d' <dosya.adı> : Geçerli klasör içindeki <dosya.adı> isimli dosyada <aranan.motif>i içermeyen satırların ekranda görüntülenmesini sağlar. Bu gibi aramalar için -e seçeneğini kullanmak zorunlu değildir.
  • sed '/<motif1>/s/<motif2>/<motif3>/' <dosya.adı> : Geçerli klasör içindeki <dosya.adı> isimli dosya içerisinde <motif1> gördüğü satırdaki <motif2>leri <motif3>e dönüştürerek dosyayı ekranda görüntüler.
  • sed '/<motif1>/!s/<motif2>/<motif3>/' <dosya.adı> : Geçerli klasör içindeki <dosya.adı> isimli dosya içerisinde <motif1> gördüğü satırlar haricindeki satırlarda bulunan <motif2>leri <motif3>e dönüştürerek dosyayı ekranda görüntüler.

grep komutu için kullanılan kurallı ifadeler sed komutu için de geçerlidir. Ama hepsi tamamen aynı özelliği göstermez.

<<Şekil 2.30 sed komutunun farklı kullanımları

Sorular

  • Emma kitabında toplam kaç cümle olduğunu Mr. ve Mrs. kelimelerini çıkarıp daha doğru olarak hesaplayın.
  • Kitap1'de en çok görünen 50.kelimeyi head/tail yerine sed kullanarak bulun.

sed komutunun sık kullanılan listesini inceleyerek sed kullanımı hakkında daha detaylı bilgi sahibi olabilirsiniz.

awk komutu

İngilizce orijinal tarifi: "pattern scanning and text processing language"

Geçerli klasörde bulunan dosyalarda motif taraması ve yazı işleme yapabilen programlama dilidir. Komutun doğru çalışabilmesi için koşul ve ifadeler tek tırnak (' ') içinde yazılmalıdır. Dosyalar da filtreleme yapma görevini üstlenir. grep ve sed komutu sadece satırlarda motif arayabilirken, awk hem satır hem sütunlarda arama yapabilir. Ayrıca grep komutu için herhangi bir koşul belirtilerek filtreleme yapılamaz.

  • awk '<koşul>{<ifade>}' <dosya.adı> : Geçerli klasör içindeki <dosya.adı> isimli dosya içinde belirtilen <koşul> olan satırlardaki belirtilen <ifade>lerin filtrelenmesini sağlayarak ekranda görüntüler. Şablon tamamen kullanılmak zorunda değildir. Komut çalıştırılırken şablon sadece ‘<koşul>’ şeklinde de kullanılabilir ve bu belirtilen koşulu içeren tüm satırların ekranda görüntülenmesini sağlar. Aynı şekilde koşul belirtilmeden '{ <ifade> }' şeklinde kullanımlarda da hiç bir ayrım yapılmadan belirtilen ifade tüm satırlarda aranarak ekranda görüntülenir.
  • awk NF<koşul> veya {print NF} !!!!!
  • awk 'NR<koşul>' <dosya.adı> : Geçerli klasördeki <dosya.adı> isimli dosya içinde belirtilen <koşul> sayısında satırları ekranda görüntüler.

Koşul veya ifade içinde sütunları belirtmek için dolar ($) işareti kullanılmalıdır. $0 dosyada bulunan satırlardaki tüm sütunları ifade ederken, $1 ilk sütunu, $2 ikinci sütunu, $3 üçüncü sütunu ifade eder. Komutun doğru çalışabilmesi için sütunların hepsinin aynı karakter ile ayrılmış olmasına veya karakterin belirtilmesine gerek yoktur. Aynı satırda bulunan hem boşluk hem tab karakterini sütun ayıracı olarak algılayabilir.

Koşul sayısal veya yazılı olarak karşılaştırmaları da kapsayabilir. Burada kullanılan bazı işaretler ve anlamları aşağıdaki tabloda belirtildiği gibidir.

%%%% TODO length fonksiyonu eklensin

{title="Tablo 2.1 awk komutu koşulları için kullanılan işaretler",width="40%"}

İşaret Anlamı
== Eşittir
!= Eşit değildir
< Küçüktür
> Büyüktür
~ İçerir
!~ İçermez
&& Ve (AND)
|| Veya (OR)

%%%%% FIX delete the image file (images/awk-tablo.png)

egrep ve sed komutunda bulunan kurallı ifadeler awk komutu için de kullanılabilir. Koşul ve ifade için satır ve sütun içerikleri direk kullanılabileceği gibi işlenip de kullanılabilirler.

Komut ayrıca sed komutunun yaptığı gibi yer değişikliği yapabilir ve matematiksel fonksiyonları algılayabilir.

<<Şekil 2.31 awk komutunun farklı kullanımları

awk komutunun sık kullanılan listesini inceleyerek awk kullanımı hakkında daha detaylı bilgi sahibi olabilirsiniz.

Sorular

  • Harfler dosyasında sadece birden fazla görünen harfleri ekranda görüntüleyin.
  • Kitap1'deki en uzun 10 kelime ile kitap2'deki en uzun 10 kelimeyi ekranda görüntüleyin.
  • Kitap1'de en çok görünen 50.kelimeyi head/tail veya sed yerine awk kullanarak bulun.
  • Harfler dosyasında sadece ikiden fazla görünen harfleri ekranda görüntüleyin.
  • Movies dosyasındaki her satırın en ortasında bulunan harf veya harflerini ekranda görüntüleyin. (ADVANCED)
  • Movies ve ratings dosyalarında 4. satır hariç her satırın son sütunlarındaki ikinci harfi ekranda görüntüleyin.
  • Kitap1 ve kitap2'de 10'dan daha az (10 dahil değil) sayıda bulunan kelimeleri bulun.
  • Movies ve ratings dosyalarının 4. sütun ve 20. karakterini ekranda görüntüleyin (kitapta olmayan bir awk fonksiyonu gerekmektedir)
  • ecoli-prot-vs-prot.out dosyası Ecoli-protein.fa dosyasındaki bütün proteinlerin kendileri ile Blast yapılması sonucunda ortaya çıkmıştır. Proteinlerin kendisiyle eşleştiği satırlar çıkarıldığında toplam kaç sonuç vardır.
  • ecoli-prot-vs-prot.out dosyasındaki Blast sonuçlarında, proteinleri kaç farklı proteine benzerlik gösterdiklerine göre sıralayınız (kendine benzerliği saymayınız) (Örnek: yhdZ, ybbA, rbbA proteinleri 79 proteine benzerlik göstermektedir)
  • Biyolojik olarak protein Blast, nükleotid Blast sonuçlarına göre daha uzak benzerlikleri de bulabilmektedir (Bunun sebebi ne olabilir?). Protein Blast sonuçlarında bulunup CDS Blast sonuçlarında bulunmayan benzer protein çiftlerini bulunuz.

%%%% TODO blast should be done again with more columns, query len, subject len, strand should be included so that more analysis can be done

%%%% TODO regarding yhdZ, ybbA and rbbA, can we do simple clustering on terminal (blastclust is a solution with special software, can we achieve similar result with unix tools)

%%%% TODO provide link for "awk & sed for bioinformatics", https://github.com/stephenturner/oneliners

Buraya kadar gördüğümüz komutlar sayesinde dosyaların açılması, içeriğine erişilmesi, filtrelenmesi, içeriğinin manipüle edilmesi ve temel analizine dair komutları görmüş olduk.

Şekil 2.32 Dosya görüntüleme, filtreleme, birleştirme, değiştirme ve analizi için kullanılan terminal komutları

Yukarıdaki resimde (kaynak) gösterilen terminal komutlarının gerçekleştirdiği işlemleri veritabanlarında yapabilen komutlar "Veri Tabanları" bölümünde gösterilecektir.

nano komutu

İngilizce orijinal tarifi: "nano's another editor, an enhanced free pico clone"

Terminalde çalışan yazı düzenleyicidir. Yeni bir dosya oluşturmak veya var olan bir dosya içinde değişiklik yapmak için kullanılır. Açılan penceren ctrl+x ile çıkış yapılır ve değişiklik yapıldığı zaman kaydedilip kaydedilmemesi için onay ister. Değişikliğin kaydedilmesi için y tuşuna, kaydedilmeden çıkış yapılabilmesi için n tuşuna basılmalıdır.

  • nano <dosya.adı> : Geçerli klasör içinde varsa <dosya.adı> isimli dosyanın açılmasını yoksa <dosya.adı> isimli bir dosya oluşturulup içine yazı yazmayı sağlar.

<<Şekil 2.33 nano komutunun kullanımı

history komutu

Kullanıcının o zamana kadar kullandığı tüm komutları zamanlarıyla birlikte gösteren komuttur.

passwd komutu

Kullanıcı şifresinin değiştirilmesini sağlayan komuttur. Daha önceden kullanılmış bir şifre tekrar kullanılamaz.

<<Şekil 2.34 passwd komutunun kullanımı

Bölüm sonu soruları

MovieLens, film önerisi hizmeti veren bir web sayfasıdır. Kullanıcılar her film için sadece beğeni değil aynı zamanda etiket bildirmektedir. Çok sayıda kullanıcıdan toplanan veriler film önerisi algoritmalarında kullanılmaktadır. MovieLens, aynı zamanda elindeki verileri ilgili kişilerle paylaşmaktadır. Aşağıdaki sorular iki dosyaki verilerle çözülecektir. movies ve ratings adlı dosyalar gerekli linkten indirilmiş ve içeriklerinde küçük düzenlemeler yapılmıştır.

{#movies-ratings-desc} movies dosyası 10681 filme dair bilgiler içermektedir ve her film için 4 sütun bulunmaktadır. Bunlar sırasıyla; film no, film adı, film yılı ve film türüdür. Birden fazla türde olan filmler için türler çubuk (|) işareti ile birleştirilmiştir.

ratings dosyası yaklaşık 10000 film için yapılan 10 milyon değerlendirmeyi içermektedir. Her bir değerlendirme 4 farklı veri içermektedir, bunlar sırasıyla; kullanıcı no, film no, değerlendirme (0.5-5 arası), değerlendirme gün ve saati. ratings dosyasındaki film no sütunu movies dosyasındaki film no sütununa denk gelmektedir.

Şimdiye kadar öğrenilen terminal komutlarını karışık şekilde kullanarak aşağıdaki soruları cevaplayınız.

Movies Soruları

  1. Listeyi önce yıl sonra film adına göre sıralayın.
  2. En çok film yapılan yılı bulun.
  3. En çok film yapılan türü bulun.
  4. Tek türü olan filmleri sayın.
  5. 2000-2005 arası yapılan filmler en çok hangi harf ile başlayan isimler almış bulup bu harfle başlayan filmleri ayrı bir dosya olarak kaydedin.

Ratings Soruları

  1. Puan veren toplam kaç kullanıcı/seyirci vardır.
  2. Puan verilen toplam kaç film vardır.
  3. En çok puan veren kullacıyı bulun.
  4. İlk oylama ve son oylama tarihlerini bulun.
  5. Aynı filme aynı puanı veren kullanıcıları bulun.
  6. Toplamda en çok puan veren üç kullanıcıyı bulun.
  7. Toplamda en az puan veren kullanıcının filmlere verdiği puanların ortalamasını bulun.
  8. Gün içerisinde en sık puan verilen saat aralığını bulun.
  9. 100-150 numara arası kullanıcıların en çok beğendiği üç filmi (filmNO cinsinden) bulun.
  10. Tüm filmlerin ortalama kaçar puan aldıklarını bulun. Tüm filmlerin ortalamasını bulun.
  11. 2 kişiden puan almış ve ortalaması 5 olan bir film, 1000 kişiden puan almış ve ortalaması 4.8 olan bir filmden daha iyi değildir. Bu tür etkileri elemek için bayesian derecelendirmesi yapalım. Bayesian derecelendirmesine göre en yüksek değeri alan 3 filmi bulun. [Formül : bayesian derecelendirme = (v ÷ (v+m)) × R + (m ÷ (v+m)) × C ] R = filmin aldığı ortalama puan, v = filmin aldığı puan sayısı, m = listelenmek için gerekli minimum puanlama sayısı (bu örnek için 1000 alalım, IMDB 1250 olarak alıyor), C = bütün filmlerin ortalaması (10. sorunun ikinci kısmında hesaplandığı üzere 3.51242)
  12. En yüksek puan ortalamasına sahip 50 filmin türlerini bulun.
  13. En çok oy kullanılan üç ayı bulun. En çok oy kullanılan üç film türünü bulun.
  14. Film yapım yılından oy kullanımına kadar en çok zaman geçen filmi bulun.
  15. Filmlerin yapım yıllarından beş sene sonrasına kadar geçen sürede aldıkları oyların ortalamasını bulun ve en çok puan alandan en az puan alana doğru sıralayın.
  16. Korku türünde en çok oylama yapılan ilk 10 filmi bulun. Korku türünde oylarının toplamı en çok olan ilk 10 filmi bulun.
  17. En az hangi türde film yapılmış bulup en az puan alan 3 filmi ekranda görüntüleyin.
  18. Her filmin kaçar kullanıcıdan oy aldığını bulun.
  19. 10'dan az kullanıcıdan oy alan filmler türlerine göre kaçar tanedir bulun.
  20. 2.soruda oy kullanılan film sayısı hesaplanmıştı. Şimdi de herhangi bir oy kullanılmamış filmleri bulun.

Soruların cevapları Ek: Cevaplar kısmındadır.

%%%% TODO: veritabanı konusuna daha kolay geçiş olması için, datamash örnekleri eklenebilir (http://www.gnu.org/software/datamash/examples/)

%%%% TODO also add https://github.com/shenwei356/csvtk OR https://github.com/wireservice/csvkit

%%%% TODO we should mention GNU parallel and https://github.com/mattgodbolt/zindex https://github.com/stedolan/jq

%%%% TODO add section of one-liners (bioinformatics ones as well) and list urls to examples: https://github.com/onceupon/Bash-Oneliner/blob/master/README.md , https://github.com/stephenturner/oneliners

%%%% TODO add ref to http://korflab.ucdavis.edu/Unix_and_Perl/unix_and_perl_v3.0.html