14 Eylül 2020 Pazartesi

sort komutu

Giriş
En sık kullanılan seçenekler -t ve -k. Açıklaması şöyle.
sort uses -t or --field-separator to specify the field delimiter and -k or --key to specify the field.
Designing Data Intensive Applications kitabındaki açıklaması şöyle
The sort utility in GNU Coreutils (Linux) automatically handles larger-than memory datasets by spilling to disk, and automatically parallelizes sorting across multiple CPU cores. 

-f seçeneği
Case insensitive sort yapar

-h seçeneği
Açıklaması şöyle. Sort yöntemini değiştirir.
-h, --human-numeric-sort compare human readable numbers (e.g., 2K 1G)
df komutu, du komutu gibi komutlar çıktılarını 5G, 10MB insanların okuyabileceği şekilde verirler. Bu gibi çıktıları sıralamak için kullanılır

Örnek
Şöyle yaparız.
sort -h -k2 your_file
Örnek
Şöyle yaparız. Her bir dizin için du -sh komutu çalıştırılır. Bu komutun çıktısı sort- rh ile büyükten küçüğe sıralanır.  head ile de ilk satır alınır.
find . -maxdepth 1 -mindepth 1 -type d -exec du -sh {} \; | sort -rh | head
-k seçeneği
Hangi sütuna göre sıralama yapılacağını belirtir. Açıklaması şöyle
-k allows you to sort via a a specific key,
Bitiş sütunu verilmezse tüm satır kullanılır. Açıklaması şöyle
-k, --key=POS1[,POS2]     start a key at POS1 (origin 1), end it at POS2
                          (default end of line)
Örnek
Şöyle yaparız. Önce ikinci sütuna göre, daha sonra beşinci sütunun üç ve dördüncü karakter aralığına göre sıralar.
sort -t : -k 2,2n -k 5.3,5.4
Açıklaması şöyle
Sort numerically on the second field and resolve ties by sorting alphabetically on the third and fourth characters of field five. Use ‘:’ as the field delimiter.
Note that if you had written -k 2n instead of -k 2,2n sort would have used all characters beginning in the second field and extending to the end of the line as the primary numeric key. For the large majority of applications, treating keys spanning more than one field as numeric will not do what you expect.
Örnek - 2. sütün ve devamı
Elimizde şöyle bir veri olsun.
2018-01-15 00:00:00,32
2018-01-15 00:00:01,32
2018-01-15 00:00:02,27
2018-01-15 00:00:03,41
2018-01-15 00:00:04,41
2018-01-15 00:00:05,24
2018-01-15 00:00:06,29
2018-01-15 00:00:07,55
2018-01-15 00:00:08,35
2018-01-15 00:00:09,21
Şöyle yaparız.
sort -t"," -k2 your_file
Örnek - 2. sütün ve devamı
Elimizde şöyle bir veri olsun
AAA BBB  | 45
Jake     | 36
Sam Sam  | 40
İkinci sütuna göre sıralamak için şöyle yaparız
sort -t '|' -k2 testfile
-M seçeneği
Ay (month) değerine göre sıralar.

Örnek
Elimizde şöyle bir veri olsun
adcblz01 14 Mar 2018  
adcblz03 23 Nov 2018  
aktestlb02 26 Aug 2019    
ckicbrwlz1 23 Mar 2018   
ckilabbrwlb1 23 Mar 2018   
bhuiflz28 09 Mar 2017  
bhuiflz47 09 Mar 2017  
bhuiflz48 09 Mar 2017  
olkeflb24 23 Jul 2019  
olkeflz46t2 09 Mar 2017  
rrjugflb7 03 Jul 2019
Önce yıl, sonra ay, sonra güne göre sıralamak için şöyle yaparız
$ sort -k4n -k3M -k2n
-n seçeneği
numeric sort anlamına gelir. Açıklaması şöyle. Sıralama yapılacak sütun alfa numerik olsa bile sadece rakam olan kısmı okur ve bu alana göre sıralama yapar.
The commands sort -u and sort | uniq are equivalent, but this equivalence does not extend to arbitrary sort options. For example, sort -n -u inspects only the value of the initial numeric string when checking for uniqueness, whereas sort -n | uniq inspects the entire line.
Örnek
Elimizde şöyle bir veri olsun.
$ cat /tmp/test_
1e971713-31e4-62d0-a3d1-37c0610c10e5
1e97d59f-bc32-6126-b7b1-0b52ddd35273
1e971713-31e4-62d0-a3d1-37c0610c10e5
Şöyle yaparız. Çıktı olarak tek bir satır alırız çünkü -n ile 1 ile başlayan tüm satırlar tek bir sayı gibi görülür ve -u ile tek bir çıktı alırız.
$ sort -nu /tmp/test_
1e971713-31e4-62d0-a3d1-37c0610c10e5
-parallel seçeneği
Elimizde 48 tane çekirdek olsun. Şöyle yaparız
$sort --parallel=48 bigfile > bigfile.sort
-r seçeneği
Açıklaması şöyle
To apply the "reverse" only on the given column, specify it after the -k:
Örnek
Elimizde şöyle bir veri olsun
arr[0]="04-Feb-2021-21-05-48"
arr[1]="18-Jan-2021-12-19-48"
arr[2]="25-Jan-2021-00-24-29"
arr[3]="26-Jan-2021-00-28-33"
arr[4]="04-Feb-2021-21-06-49"
arr[5]="18-Jan-2021-12-19-48"
arr[6]="25-Jan-2021-00-24-29"
arr[7]="26-Jan-2021-00-28-33"
Şöyle yaparız. İkinci sütundaki bir ve üçüncü karakterler alınır.-M ile aya göre sıralanır. -r ile azalarak sıralanır
sort -t- -k2.1,2.3Mr
Çıktı olarak şunu alırız
[04-Feb-2021-21-06-49]
[04-Feb-2021-21-05-48]
[26-Jan-2021-00-28-33]
[26-Jan-2021-00-28-33]
[25-Jan-2021-00-24-29]
[25-Jan-2021-00-24-29]
[18-Jan-2021-12-19-48]
[18-Jan-2021-12-19-48]
Örnek
Designing Data Intensive Applications kitabındaki örnek şöyle. Bir log dosyadaki en fazla geçen URL'yi bulmak için şöyle yaparız. 
- Log dosyasındaki 7 sütun bulunur ve sort edilir. 
- Daha sonra uniq -c ile kaç tane olduğu bilgisi ilave edilerek tek bir kere gösterilir. 
- Sonra sort -n ile ilk baştaki kaç tane sayısına göre sıralanır -r ile büyükten küçüğe doğru sıralanır. 
- head ile ilk 5 tanesi gösterilir. 
cat /var/log/nginx/access.log |
  awk '{print $7}' |
  sort |
  uniq -c |
  sort -r -n |
  head -n 5
-s seçeneği
Açıklaması şöyle. Aynı olan iki değerin yerlerini değiştirmez.
-s, --stable
              stabilize sort by disabling last-resort comparison
Örnek
Elimizde şöyle bir dosya olsun
START
test
TEST
tEST
END
Şöyle yaparız. İlk kullanımda sadece -f seçeneği ile case insensitive sıralama yapılıyor. Bu durumda TEST ve test yer değiştirebilir. İkinci kullanımda ise hem case insensitive hem de stable sort yapılıyor. Bu durumda test, TEST ve tEST yer değiştirmiyor.
ek@Cord:~$ sort -f fred  # without -s
END
START
TEST
tEST
test
ek@Cord:~$ sort -fs fred  # with -s
END
START
test
TEST
tEST
-t seçeneği - Tek karakter
Ayraç olarak kullanılacak karakteri belirtir. Açıklaması şöyle
 -t, --field-separator=SEP
Örnek
Ayraç olarak : karakterini kullanarak isimlere göre sıralamak için şöyle yaparız.
sort -g -t : -k3 /etc/passwd
Şöyle yaparız.
sort -g -t : -k3 /etc/group
Örnek
Şöyle yaparız. Ancak MacOS sort komutunda bu seçeneğin kullanımında sıkıntı var.
sort -k'1,1r' -k'2,2' -t'±'
-u seçeneği
unique anlamına gelir.

Örnek
Şöyle yaparız.
$ sort -k2,2 -u < filename | sort -k4,4n
-V/--version-sort seçeneği
Açıklaması şöyle. Önce alfa kısma göre sıralama yapar. Daha sonra sayıları sürüm numarasına göre sıralar. Bu seçeneğe aynı zamanda "natural sort" ta deniliyor ancak bence kulağa "version sort" daha mantıklı geliyor
--version-sort’
     Sort by version name and number.  It behaves like a standard sort,
     except that each sequence of decimal digits is treated numerically
     as an index/version number.  (*Note Details about version sort::.)
Örnek
Elimizde şöyle bir veri olsun
name name space 2018
name2 name2 space (active 2020)
name1 name1 space (c. 2019)
Şöyle yaparız. Çıktı olarak ilk sütuna göre sıralanmış veri alırız.
sort -Vk1,1 file

name name space 2018
name1 name1 space (c. 2019)
name2 name2 space (active 2020)
Örnek
Elimizde şöyle bir veri olsun
DATA1
DATA10
DATA11
DATA12
DATA2
DATA3
DATA4
DATA5
DATA6
DATA7
DATA8
DATA9
FRA1
FRA10
FRA11
FRA2
FRA3
..
OCR1
OCR2
OCR3
....
Çıktı olarak şunu alırız
DATA1
DATA2
DATA3
DATA4
DATA5
DATA6
DATA7
DATA8
DATA9
DATA10
DATA11
DATA12
FRA1
FRA2
FRA3
..
..
FRA10
FRA11
..
OCR1
OCR2
OCR3
....
-z seçeneği
zero-terminated anlamına gelir. Bu seçenek GNU extension. Satırı "new line" yerine 0 değeri sonlandırır. Şöyle yaparız.
while IFS= read -r -d '' entry; do
  printf 'Processing: %s\n' "$entry"
done < <(find . -type f -print0 | sort -z)





Hiç yorum yok:

Yorum Gönder