Perintah Linux

Perintah pengurutan bash

Perintah pengurutan bash
Semoga berhasil mencoba menerapkan algoritme pengurutan di bash daripada selesai sebelum besok. Jangan khawatir, Anda tidak perlu melakukannya karena Anda memiliki perintah pengurutan.

Dengan pengurutan, Anda dapat mengurutkan file berdasarkan urutan dalam kamus atau nilai numerik, mengacak baris file, menghapus baris duplikat, dan memeriksa apakah file diurutkan.

Anda mungkin dapat melakukan hal-hal lain dengannya, tetapi pertama-tama, mari kita khawatir tentang cara menggunakan sort dalam skrip bash.

Apa itu sort??

Sort adalah perintah eksternal yang menggabungkan file sambil menyortir kontennya menurut jenis sortir dan menulis hasil sortir ke output standar.

Urutkan opsi perintah untuk bash

Perintah sortir hadir dengan 31 opsi (13 utama dan 18 dikategorikan sebagai lainnya). Pemrograman bash yang paling berpengalaman (bahkan para ahli) hanya mengetahui beberapa opsi pengurutan utama yang diperlukan untuk bertahan. Yang lain jarang disentuh. Beruntung bagi Anda, kami punya waktu untuk menyentuh mereka semua.

Opsi pengurutan utama

Ini adalah opsi yang membantu Anda menyelesaikan dan mengurutkan (Penyortiran) selain memanipulasi hasil yang diurutkan (Pemrosesan pasca) dan menerapkan filter (Filter) sebelum menyortir.

Penyortiran

Sortir dilengkapi dengan 5 jenis penyortiran yang berbeda. Berikut adalah tabel yang menunjukkan setiap jenis pengurutan dengan opsi terkait.

Menyortir Opsi pendek / opsi panjang / dll
kata
Sortir numerik (umum) -g / -urutan-numerik-umum
umum-numerik
dukungan untuk notasi ilmiah
0.1234e4 = 1234
Sortir numerik (manusia) -h / -pengurutan-numerik-manusia
manusia-numerik
1.234K = 1234
numerik -n / -urutan numerik
numerik
… < -1 < 0 < 1 <…
Bulan -M / -urutan bulan
bulan
Tidak diketahui < Jan < Feb <… < Nov < Dec
Acak -r / -pengurutan acak
acak
Versi: kapan -V / -versi-sort
Versi: kapan

Perhatikan bahwa setiap jenis pengurutan memiliki opsi panjang yang diakhiri dengan -sort. Selain opsi pengurutan tertentu, opsi -sort=WORD dapat digunakan untuk mengurutkan berdasarkan kata. Misalnya -sort=random dapat digunakan sebagai pengganti -random-sort atau -r.

Contoh

Berikut adalah beberapa contoh perintah pengurutan untuk setiap metode pengurutan.

Contoh) Mengurutkan nama

Sortir tidak memiliki masalah menyortir baris menurut abjad. Pertimbangkan daftar orang terkenal yang tidak diurutkan.

Fungsi

orang terkenal()

curl --diam https://www.biografi online.bersih/orang/terkenal-100.html
| grep post-konten | sed -e 's/<[^>]*.//g' -e 's/Perang Dunia II//g' -e 's/\(Wilbur\)
/\1 Wright/'| grep -o -e '\(\([A-Z]\+[.]\?\)\+[a-z]*\s\)\+([0-9]\+\s[^)]\+.'

Garis komando

orang terkenal | menyortir

Keluaran

Stephen King (1947 - )
Steve Jobs (1955 - 2012)
Sengatan (1951 - )
Hutan Harimau (1975 - )
Tom Cruise (1962 - )
Usain Bolt (1986 - )
Vinci (1452 - 1519)
Walt Disney (1901 - 1966)
Wilbur Wright (1867 - 1912)
Woodrow Wilson (1856 - 1924)

Contoh) Pengurutan numerik umum

Jika kita perlu mengurutkan nilai numerik dengan notasi ilmiah fakta seperti 99e2, kita dapat menggunakan pengurutan numerik umum.

Fungsi

nilai-numerik-tidak diurutkan ()

barisan 100 | urutkan --pengurutan acak | sed '3i 9e2' | sed '3i 99K'

Pertimbangkan output yang diurutkan menggunakan setiap metode. Perhatikan bahwa selain berisi nilai 1 hingga 100, daftar juga menyertakan '9e12' (900) dan '99K' (99000).

Garis komando

nilai-numerik yang tidak diurutkan | urutkan -n

Keluaran

96
97
98
99
99K
100

Bagaimana dengan 900 dan 99000. Itu benar itu hanya pengurutan numerik. Lanjut.

Garis komando

nilai-numerik yang tidak diurutkan | urutkan -h

Keluaran

96
97
98
99
100
99K

Bagaimana dengan 900. Itu benar itu hanya jenis numerik manusia numer. Lanjut.

Garis komando

nilai-numerik yang tidak diurutkan | urutkan -g

Keluaran

96
97
98
99
99K
100
9e2

Bagaimana dengan 99000. Itu benar itu hanya pengurutan numerik umum. Seperti yang Anda lihat, tidak ada metode penyortiran yang kompatibel dalam kasus ini; namun, itu tidak berarti Anda tidak dapat menemukan solusi.

Garis komando

nilai-numerik yang tidak diurutkan | sed 's/[kK]/e3/' | urutkan -g

Keluaran

96
97
98
99
100
9e2
99e3

Sekarang lebih seperti itu.

Contoh) Pengurutan numerik manusia

Jika kita perlu mengurutkan nilai numerik dengan memperhatikan arti notasi seperti K, G, M, dan E, kita dapat menggunakan pengurutan numerik manusia.

Garis komando

barisan 100 | urutkan --pengurutan acak | sed '3i 3k' | urutkan -h

Keluaran

96
97
98
99
100
3k

Contoh) Pengurutan numerik

Jika yang kita butuhkan hanyalah mengurutkan bilangan bulat, pengurutan numerik berhasil does.

Garis komando

barisan 100 | urutkan --pengurutan acak | sort --numerics-sort

Keluaran

95
96
97
98
99
100

Contoh) Jenis bulan

Pengurutan bulan memungkinkan Anda untuk memesan baris berdasarkan bulan. Ini terbukti berguna untuk mengelompokkan baris berdasarkan bulan terutama jika opsi pengurutan berdasarkan waktu tidak tersedia.

Fungsi

bulan ()

kucing  <Jan
Februari
Merusak
April
Mungkin
Juni
Juli
Agustus
Sep
Oktober
November
Desember
EOF

Misalkan bulan tidak diurutkan.

Garis komando

bulan | urutkan --pengurutan acak

Keluaran

Merusak
Oktober
Desember
April
Mungkin
Sep
Agustus
November
Juli
Jan
Februari
Juni

Kami selalu dapat mengurutkan berdasarkan bulan.

Garis komando

bulan | urutkan --pengurutan acak | urutkan --urutkan bulan

Keluaran

Jan
Februari
Merusak
April
Mungkin
Juni
Juli
Agustus
Sep
Oktober
November
Desember

Perhatikan bahwa jika kita mengubah Des ke substring apa pun di bulan November, katakan 'Novem', itu akan muncul setelah 'Nov' dalam output yang diurutkan.

Contoh) Sortir acak - bunuh terminal orang lain

Seperti yang diharapkan, pengurutan acak melakukan kebalikan dari penyortiran, mencampuradukkan garis.

Misalkan untuk tujuan pendidikan kita ingin membunuh pengguna lain. Kami harus memastikan itu bukan pty kami dan mengacak daftar sehingga lebih bagus dan kami dapat mengatakan bahwa pty dipilih secara acak.

Perintah

pesan-pty ()


pty lokal;
pty="$1"
;
echo -n "Anda akan masuk" > /dev/$pty;
untuk saya dalam 5 4 3 2 1;
melakukan
tidur 1;
echo -n " ​​$i" > /dev/$pty;
selesai;
gema "Sampai jumpa!" > /dev/$pty;
tidur 1


ps | grep pty | grep -v -e $( mypty ) | urutkan --pengurutan acak | kepala -1 > stdin;

pesan-pty $( pty < stdin );
bunuh $( pid < stdin )


Keluaran di terminal orang lain
Anda akan turun dalam 5 4 3 2 1 Sampai jumpa!]
(keluar)

Contoh) Pengurutan versi - pengurutan ips

Seperti yang Anda ketahui, file sumber dapat diversi menggunakan string seperti 1.0. Selain itu, versi mungkin lebih dalam dengan nomor versi seperti 1.0.0 seperti yang terlihat dalam skema versi semantik populer.

Pengurutan versi memungkinkan Anda mengurutkan nomor versi version. Bagus! Sekarang apa? Mari kita mengujinya.

Untuk contoh ini, saya sudah menyiapkan skrip bash untuk menghasilkan ip acak sehingga kita tidak harus pergi ke sana. Ada di repo. Bagi kita yang tidak memiliki repo, inilah permulaan yang cepat.

Perintah

git clone https://github.com/temptemp3/linuxhint.com.git
alias random-ips='test -f "linuxhint.com/generate-random-ips.sh" ; bash $_'

Sekarang setelah Anda siap, mari kita mulai.

Garis komando

acak-ips 200 | tee ips

Keluaran

199.174.177.98
180.33.247.107
87.130.125.109
76.86.8.20
162.41.183.150
226.58.10.196
83.121.11.145
80.199.197.19
44.214.89.52
185.174.143.111

Oke, itu berhasil. Sekarang mari kita lihat apa yang terjadi ketika kita mencoba dan mengurutkan ips.

Garis komando

urutkan ips

Keluaran

76.88.194.157
8.96.11.181
82.169.213.206
84.218.132.51
84.3.101.97
87.137.131.40
87.59.32.91
89.149.111.242
97.121.162.244
98.145.130.186

Pada pandangan pertama, tampaknya berfungsi tetapi garis seperti 8.96.11.181 akan muncul di tempat lain.

Perintah


untuk o dalam d h n V g M
melakukan
urutkan ips -$o > ips$o,,
selesai

echo semua jenis sama dengan pengurutan numerik
diff ipsn,d 1>/dev/null || gema kamus pesanan != pengurutan numerik
diff ipsn,h 1>/dev/null || gema pengurutan numerik manusia != pengurutan numerik
diff ipsn,g 1>/dev/null || gema pengurutan numerik umum != pengurutan numerik
diff ipsn,v 1>/dev/null ||
pengurutan versi gema != pengurutan numerik
show_n_v_ips_diff="benar"


uji ! "$show_n_v_ips_diff" || perbedaan ipn,v

Keluaran

semua jenis sama dengan nomor urut
urutan kamus != pengurutan numerik
pengurutan versi != pengurutan numerik
13,14h12
< 44.221.43.20
< 44.27.108.172
15a14,15
> 44.27.108.172
> 44.221.43.20
27d26
< 84.218.132.51
29c28
< 87.137.131.40

Seperti yang Anda lihat, pengurutan versi memungkinkan Anda untuk mengurutkan nomor versi ketika metode pengurutan lainnya gagal.

Contoh) Pengurutan versi - menyortir nama file dengan nomor versi

Berdasarkan contoh terakhir, mari gunakan sortir versi sedikit lebih dekat dengan tujuan penggunaannya. Seperti yang Anda ketahui, nomor versi biasanya muncul dalam nama file. Lihat Detail tentang pengurutan versi.

Pertama, mari kita ubah ips menjadi sesuatu yang lain seperti file sumber proyek.

Perintah

alfa ()
alpha="abcdefghijklmnopqrstuvwxyz";
echo -n $alpha:$(( RANDOM % 26 ))::1

beta ()
alfa = "ab";
echo -n $alpha:$(( RANDOM % 2 ))::1


ip kucing | saat membaca -r baris; melakukan
echo $(alpha)-v$line$(test $(( RANDOM % 5 )) -eq 0 || beta).ter.gz;
selesai | tee teguk

Keluaran

x-v56.16.109.54.ter.gz
k-v117.38.14.165a.ter.gz
d-v87.59.32.91a.ter.gz
h-v115.215.64.100.ter.gz
s-v72.174.246.218b.ter.gz
h-v163.93.19.173.ter.gz
u-v184.225.11.92b.ter.gz
y-v205.53.5.211a.ter.gz
t-v175.196.164.17b.ter.gz
e-v167.42.221.178b.ter.gz
c-v126.54.190.189b.ter.gz
b-v169.180.221.131a.ter.gz
y-v210.125.170.231a.ter.gz
x-v71.56.120.9b.ter.gz

Olahraga

Buat perintah di atas berjalan lebih cepat menggunakan xargs

Lihat contoh cara menggunakan perintah xargs di skrip bash.

Kali ini, kami bahkan tidak akan repot-repot menggunakan metode penyortiran lainnya.

Garis komando

sortir -V teguk

Keluaran

d-v127.100.108.192.ter.gz
e-v62.140.229.42a.ter.gz
e-v149.77.211.215a.ter.gz
e-v167.42.221.178b.ter.gz
e-v194.189.236.29a.ter.gz
e-v198.145.199.84b.ter.gz
e-v240.1.147.196b.ter.gz
f-v50.100.142.42b.ter.gz
f-v117.58.230.116.ter.gz
f-v139.17.210.68b.ter.gz
f-v153.18.145.133b.ter.gz
g-v201.153.203.60b.ter.gz
g-v213.58.67.108.ter.gz
h-v5.206.37.224.ter.gz

Sekarang Anda melihat bahwa pengurutan versi mungkin berguna saat menyortir nama file dengan nomor versi.

Pra sortir

Sortir memiliki empat opsi utama yang memengaruhi penyortiran aktual yaitu, -ignore-leading-blanks, -ignore-case, -ignore-nonprinting, dan -dictionary-order, yang mungkin tumpang tindih atau tidak. Contoh menggunakan setiap opsi ikuti.

Urutkan dengan mengabaikan bagian kosong di depan

Sortir memungkinkan input kosong di depan diabaikan sebagai opsi. Kosong terkemuka dipertahankan dalam output yang diurutkan.

Pilihan

--abaikan-awal-kosong

Pemakaian

sort --ignore-leading-blanks

Perintah

orang terkenal > fp
kucing >> fp << EOF
Marilyn Monroe (1926 - 1962)
Abraham Lincoln (1809 - 1865)
EOF
kucing fp | urutkan | tac

Keluaran

Alfred Hitchcock (1899 - 1980)
Albert Einstein (1879 - 1955)
Al Gore (1948 - )
Abraham Lincoln (1809 - 1865)
Marilyn Monroe (1926 - 1962)
Abraham Lincoln (1809 - 1865)

Perhatikan bahwa spasi awal di baris yang ditambahkan ke fp muncul pertama kali dalam output sortir.

Untuk memperbaikinya, kita perlu mengabaikan kosong di depan sebagai berikut:.

Perintah

orang terkenal > fp
kucing >> fp << EOF
Marilyn Monroe (1926 - 1962)
Abraham Lincoln (1809 - 1865)
EOF
kucing fp | sort --ignore-leading-blanks --ignore-leading-blanks | tac

Keluaran

Marilyn Monroe (1926 - 1962)
Marilyn Monroe (1926 - 1962)
Marie Antoinette (1755 - 1793)

Albert Einstein (1879 - 1955)
Al Gore (1948 - )
Abraham Lincoln (1809 - 1865)
Abraham Lincoln (1809 - 1865)

Alternatif

kucing fp | sed 's/^\s*//' | urutkan | tac

Perhatikan bahwa alternatif tidak mempertahankan bagian kosong di depan dalam output sortir.

Urutkan pengabaian kasus

Sortir memungkinkan kasus input diabaikan sebagai opsi. Kasing disimpan dalam output yang diurutkan.

Pilihan

--kasus abaikan

Pemakaian

sort --ignore-case

Perintah

orang terkenal > fp
kucing >> fp << EOF
Abraham Lincoln (1809 - 1865)
Abraham Lincoln (1809 - 1865)
EOF
kucing fp | urutkan | tac

Keluaran

Amelia Earhart (1897 - 1937)
Alfred Hitchcock (1899 - 1980)
Albert Einstein (1879 - 1955)
Al Gore (1948 - )
Abraham Lincoln (1809 - 1865)
Abraham Lincoln (1809 - 1865)

Perhatikan bahwa spasi awal di baris yang ditambahkan ke fp muncul pertama kali dalam output sortir.

Untuk memperbaikinya, kita perlu mengabaikan kosong di depan sebagai berikut:.

Perintah

orang terkenal > fp
kucing >> fp << EOF
Abraham Lincoln (1809 - 1865)
Abraham Lincoln (1809 - 1865)
EOF
kucing fp | sort --ignore-case | tac

Keluaran

Amelia Earhart (1897 - 1937)
Alfred Hitchcock (1899 - 1980)
Albert Einstein (1879 - 1955)
Al Gore (1948 - )
Abraham Lincoln (1809 - 1865)
Abraham Lincoln (1809 - 1865)
Abraham Lincoln (1809 - 1865)

Alternatif

kucing fp | saat membaca -r baris ; lakukan echo $baris,, ; selesai | urutkan | tac

Perhatikan bahwa alternatif tidak mempertahankan kasus dalam output sortir.

Urutkan mengabaikan noncetak

Sortir memungkinkan input noncetak diabaikan sebagai opsi. Nonprinting dipertahankan dalam output yang diurutkan.

Pilihan

--abaikan-nonprinting

Pemakaian

sort --ignore-nonprinting

Perintah

orang terkenal > fp
echo -e "\x90Abe" >> fp
kucing fp | urutkan | tac

Keluaran

Audrey Hepburn (1929 - 1993)
Angelina Jolie (1975 - )
Amelia Earhart (1897 - 1937)
Alfred Hitchcock (1899 - 1980)
Albert Einstein (1879 - 1955)
Al Gore (1948 - )
Abraham Lincoln (1809 - 1865)

Sepertinya kita kehilangan 'Abe' lakukan untuk karakter yang tidak dicetak dalam input pengurutan.

Untuk memperbaikinya, kita perlu mengabaikan karakter non-cetak.

Perintah

orang terkenal > fp
echo -e "\x90Abe" >> fp
kucing fp | sort --ignore-nonprinting | tac
[/cc\
Keluaran
[cc lang="bash"]
Amelia Earhart (1897 - 1937)
Alfred Hitchcock (1899 - 1980)
Albert Einstein (1879 - 1955)
Al Gore (1948 - )
Abraham Lincoln (1809 - 1865)
Abe

Urutkan urutan kamus

Sortir memungkinkan semua input diabaikan kecuali spasi dan karakter alfanumerik sebagai opsi. Input dipertahankan dalam output yang diurutkan.

orang terkenal > fp
echo -e "\x90Abe" >> fp
kucing fp | urutkan --d | tac

Sortir postingan

Sortir memiliki satu opsi utama yang tidak memengaruhi penyortiran yaitu, -reverse. Namun, ini memengaruhi output, memungkinkan urutan diubah antara naik dan turun. Contoh berikut.

Urutkan keluaran terbalik

Sortir memungkinkan output ditampilkan dalam urutan terbalik sebagai opsi.

Pilihan

--balik

Pemakaian

urutkan --terbalik

Garis komando

orang terkenal | urutkan --terbalik

Keluaran

Angelina Jolie (1975 - )
Amelia Earhart (1897 - 1937)
Alfred Hitchcock (1899 - 1980)
Albert Einstein (1879 - 1955)
Al Gore (1948 - )
Abraham Lincoln (1809 - 1865)

Alternatif

urutkan | tac

Pilihan lain untuk pengurutan

Ada dua puluh dua opsi lain untuk pengurutan. Contoh mengikuti.

Sortir cek

Sortir memiliki opsi yang memungkinkan Anda untuk memeriksa apakah input diurutkan. Ini kembali setelah contoh pertama dari garis yang tidak disortir. Jika input diperlukan untuk diurutkan tetapi kemungkinan sudah diurutkan, menggunakan pemeriksaan pengurutan adalah tepat.

Pilihan

--memeriksa

Pemakaian

urutkan --centang

Garis komando

barisan 10 | urutkan --pengurutan acak | urutkan --centang

Keluaran

urutkan: -:3: ketidakteraturan: 10

Garis komando

barisan 10 | urutkan --pengurutan acak | urutkan | urutkan --centang

Keluaran

(kosong)

Sortir keluaran

Sortir memiliki opsi yang memungkinkan Anda menentukan file untuk menulis alih-alih menggunakan keluaran atau pengalihan standar. Penggunaannya dapat meningkatkan kompatibilitas di seluruh lingkungan skrip.

Pilihan

--keluaran = FILE

Pemakaian

urutkan --output=FILE

Garis komando

barisan 10 | sort --random-sort --output=random-10

Keluaran

(kosong)

Urutkan null diakhiri

Sortir memiliki opsi yang memungkinkan Anda menyetel pembatas baris ke nol alih-alih baris baru.

Pilihan

--berakhir nol

Pemakaian

urutkan --dihentikan nol

Garis komando

barisan 10 | tr '\012' '\000' | urutkan --berakhir nol --pengurutan acak

Keluaran

25346178910

Urutkan stabil

Sortir memiliki opsi yang memungkinkan Anda menonaktifkan perbandingan pilihan terakhir. Akibatnya, runtime yang lebih stabil dapat dicapai jika input cukup besar yang dapat menyebabkan sortir berjalan tidak stabil.

Pilihan

--stabil

Pemakaian

sort --stabil --

Garis komando

deret waktu 1000000 | urutkan --pengurutan acak | sort --stable >/dev/null

Keluaran

nyata    0m9.138 detik
pengguna    0m9.201 detik
sys     0m0.107 detik

Urutkan ukuran buffer

Sortir memiliki opsi yang memungkinkan Anda untuk mengatur jumlah memori yang digunakan sebagai buffer saat menyortir. Ini dapat digunakan untuk membatasi konsumsi memori menyortir input yang lebih besar. Performa mungkin terpengaruh.

Pilihan

--buffer-size = UKURAN

Pemakaian

urutkan --buffer-size=64

Garis komando

deret waktu 1000000 | urutkan -urutkan acak | sort -stable -buffer-size=64 >/dev/null

Keluaran

nyata    0m21.685 detik
pengguna    0m9.858 detik
sys     0m2.092s

Urutkan unik

Sortir memiliki opsi yang memungkinkan Anda menghapus baris duplikat dalam output sortir

Pilihan

--unik

Pemakaian

sort --unikuni

Garis komando

gema 1 2 2 4 5 | tr '\040' '\000' | urutkan --berakhir nol --unik

Keluaran

1245

Alternatif

urutkan | unik

Kesimpulan

Sort adalah perintah eksternal yang berguna tidak hanya ketika digunakan dalam kombinasi dengan perintah eksternal lainnya, tetapi juga berguna ketika digunakan dengan perintah tanpa metode pengurutan bawaan seperti fungsi yang ditentukan pengguna atau skrip bash secara umum.

Cara Menginstal dan Memainkan Doom di Linux
Pengantar Doom Seri Doom berasal dari tahun 90-an setelah rilis Doom. Itu adalah hit instan dan sejak saat itu seri game telah menerima banyak penghar...
Vulkan untuk Pengguna Linux
Dengan setiap generasi baru kartu grafis, kami melihat pengembang game mendorong batas kesetiaan grafis dan selangkah lebih dekat ke fotorealisme. Tet...
OpenTTD vs Simutrans
Membuat simulasi transportasi Anda sendiri bisa menyenangkan, santai, dan sangat menarik. Itulah mengapa Anda perlu memastikan bahwa Anda mencoba game...