Sed komutunu Uygulamaya çalışalım
Aşağıdaki içeriğe sahip örnek bir CSV dosyası düşünelim:
$ cat file
Solaris,25,11
Ubuntu,31,2
Fedora,21,3
LinuxMint,45,4
RedHat,12,5
- 1. Alanı veya sütunu kaldırmak için :
$ sed 's/[^,]*,//' file
25,11
31,2
21,3
45,4
12,5
Bu normal ifade, virgülsüz ([^,]*) karakter dizisini arar ve bunları siler, bu da 1.alanın kaldırılmasına neden olur.
- Yalnızca son alanı yazdırmak VEYA son alan dışındaki tüm alanları kaldırmak için:
$ sed 's/.*,//' file
11
2
3
4
5
Bu regex son virgüle kadar her şeyi kaldırır(.* ,) son alan dışındaki tüm alanların silinmesine neden olur.
- Yalnızca 1. alanı yazdırmak için:
$ sed 's/,.*//' file
Solaris
Ubuntu
Fedora
LinuxMint
RedHat
Bu regex(,.* ) 1. virgülden başlayarak sonuna kadar olan karakterleri kaldırır ve son alan dışındaki tüm alanların silinmesine neden olur.
- 2. Alanı silmek için:
$ sed 's/,[^,]*,/,/' file
Solaris,11
Ubuntu,2
Fedora,3
LinuxMint,4
RedHat,5
Regex (, [ ^ ,]*,) bir virgül ve ardından 2.sütunun eşleşmesiyle sonuçlanan bir karakter dizisi arar ve eşleşen bu kalıbı yalnızca virgülle değiştirir ve sonuçta 2. sütunun silinmesiyle sonuçlanır.
Not: Ortadaki alanları silmek, her alanın tam anlamıyla eşleştirilmesi gerektiğinden sed'de daha da zorlaşır.
- Yalnızca 2. alanı yazdırmak için:
$ sed 's/[^,]*,\([^,]*\).*/\1/' file
25
31
21
45
12
Regex ilk alanla, ikinci alanla ve geri kalanıyla eşleşir, ancak 2.alanı tek başına gruplandırır. Tüm satır şimdi 2.alanla(\1) değiştirilir, bu nedenle yalnızca 2. alan görüntülenir.
- Yalnızca son sütunun tek basamaklı bir sayı olduğu satırları yazdırın:
$ sed -n '/.*,[0-9]$/p' file
Ubuntu,31,2
Fedora,21,3
LinuxMint,45,4
RedHat,12,5
Regex (, [0-9]$) son alanda tek bir basamak olup olmadığını denetler ve p komutu bu koşulla eşleşen satırı yazdırır.
- Dosyadaki tüm satırları numaralandırmak için:
$ sed = file | sed 'N;s/\n/ /'
1 Solaris,25,11
2 Ubuntu,31,2
3 Fedora,21,3
4 LinuxMint,45,4
5 RedHat,12,5
Bu cat-n komutunun simülasyonu. awk bunu özel değişken nr'yi kullanarak kolayca yapar. Sed'in ' = ' komutu, her satırın satır numarasını ve ardından satırın kendisini verir. Sed çıktısı, her 2 satırı birleştirmek için başka bir sed komutuna bağlanır.
- 1. alan 'Ubuntu'ise son alanı 99 ile değiştirin:
$ sed 's/\(Ubuntu\)\(,.*,\).*/\1\299/' file
Solaris,25,11
Ubuntu,31,99
Fedora,21,3
LinuxMint,45,4
RedHat,12,5
Bu regex 'Ubuntu' ile eşleşir ve son sütun hariç sonuna kadar ve her birini de gruplar. Yedek parçada, yeni 99 numara ile birlikte 1. ve 2. grup ikame edilir.
- 1. alan 'RedHat'ise 2. alanı silin:
$ sed 's/\(RedHat,\)[^,]*\(.*\)/\1\2/' file
Solaris,25,11
Ubuntu,31,2
Fedora,21,3
LinuxMint,45,4
RedHat,,5
1. alan 'RedHat', 2. alan ve kalan alanlar gruplandırılır ve değiştirme yalnızca 1. ve son grupla yapılır ve 2. alanın silinmesine neden olur.
- Sonuna yeni bir sütun eklemek için (son sütun) :
$ sed 's/.*/&,A/' file
Solaris,25,11,A
Ubuntu,31,2,A
Fedora,21,3,A
LinuxMint,45,4,A
RedHat,12,5,A
Regex (.* ) tüm satırı eşleştirir ve satırın kendisi (&) ve yeni alanla değiştirir.
- Başa yeni bir sütun eklemek için (1. sütun):
$ sed 's/.*/A,&/' file
A,Solaris,25,11
A,Ubuntu,31,2
A,Fedora,21,3
A,LinuxMint,45,4
A,RedHat,12,5
Son örnekle aynı şekilde, yalnızca eşleşen satırı yeni sütun izler
Bu yardımcı olacağını umuyoruz. Awk veya başka bir komut kullanmanız gerekirse bana bildirin.
Teşekkür ederim
sed -Ei "$rownum s/$newvalue/$col" file.csv
ve bir hata attı ama bu konuda daha fazla bilgi edinmek istiyorum. Okumak için herhangi bir kaynak da yararlı olacaktır.