Apa itu shuf?

Apa itu shuf?

shuf adalah utilitas command line seperti sort yang disertakan dalam Coreutils. Anda mungkin telah menebak bahwa ini digunakan untuk mengacak semu input yang diberikan dengan cara yang sama seperti Anda mengocok setumpuk kartu. Anda menebak dengan benar!

Di sini kita akan membahas perintah shuf beserta alternatifnya untuk berjaga-jaga jika Anda terjebak tanpa shuf.

Di mana mencari bantuan di shuf

Setelah Anda mengetahui apa itu shuf, langkah selanjutnya adalah mengetahui cara menggunakannya. Seperti kebanyakan utilitas command line, shuf hadir dengan opsi –help long.

Memerintah

# shuf --help

Usage: shuf [OPTION]... [FILE]
or:  shuf -e [OPTION]... [ARG]...
or:  shuf -i LO-HI [OPTION]...

Write a random permutation of the input lines to standard output.
With no FILE, or when FILE is -, read standard input.
Mandatory arguments to long options are mandatory for short options too.

-e, --echo                treat each ARG as an input line
-i, --input-range=LO-HI   treat each number LO through HI as an input line
-n, --head-count=COUNT    output at most COUNT lines
-o, --output=FILE         write result to FILE instead of standard output
--random-source=FILE      get random bytes from FILE
-r, --repeat              output lines can be repeated
-z, --zero-terminated     line delimiter is NUL, not newline
--help                    display this help and exit
--version                 output version information and exit

Tiga Cara Shufu

Ada tiga cara untuk menggunakan perintah shuf yaitu:

  1. file shuf
  2. daftar shuf
  3. jarak shuf

Setiap cara memiliki kelebihannya masing-masing. Pengetahuan tentang semua cara sebelumnya dapat mengurangi kebutuhan untuk menggunakan perintah eksternal lainnya dalam hubungannya dengan perintah shuf.

file shuf

File shuf adalah cara shuf yang paling umum digunakan di command line. Ketika opsi -e atau -i tidak disertakan dalam opsi, shuf akan beroperasi sebagai file shuf. Artinya, input yang akan diacak akan berupa file apakah input standar atau file yang diberikan. Kata terakhir dalam daftar parameter mungkin berupa nama file. Jika parameter ini dihilangkan, file dianggap sebagai input standar dari shell atau disalurkan. A – dapat dimasukkan mengikuti konvensi bahwa input standar disimpulkan.

Di sini ikuti useran dan cara menentukan file dalam file shuf.

Penggunaan

Usage: shuf [OPTION]... [FILE]

Cara untuk menentukan file

Ada lebih dari satu cara untuk menentukan file menggunakan file shuf. Berikut adalah contoh perintah untuk setiap cara.

File implisit sebagai input standar

Dengan cara ini kita menghilangkan file dari argumen perintah shuf. Mengikuti konvensi, Anda dapat memilih untuk menyertakan – sebagai pengganti file untuk menunjukkan file yang akan diambil sebagai input standar.

perintah

{
    seq 3 | shuf
}

Keluaran

1
3
2

Explicit file as standard input

perintah

{
    seq 3 | shuf -
}

Keluaran

3
1
2

Catatan

(1) Menambahkan a – di akhir shuf berfungsi sebagai isyarat visual yang meningkatkan keterbacaan dalam skrip bash.

File as the name of file

Dengan cara ini, kami menentukan nama file sebagai file dalam argumen dari perintah shuf. Berikut ini beberapa contoh file shuf menggunakan file.

Acak jalur input dari terminal

perintah

{
    shuf /dev/fd/1
}
asdf
sdf
df
f
Ctrl-D

Keluaran

df
f
asdf
sdf

Catatan

(1) Perintah shuf di atas shuf /dev/fd/1 sama dengan shuf –

(2) Penghentian jalur input melalui Ctrl-D diperlukan

Acak baris dalam file

perintah

{
    seq 3 > file;
    shuf file;
    rm -f file
}

Keluaran

2
1
3

list shuf

Pada cara terakhir untuk shuf, kami mengoperasikan file atau input yang disalurkan ke perintah shuf. Dengan cara shuf ini, kami mengizinkan baris input untuk ditentukan sebagai argumen dari perintah shuf menggunakan opsi -e, memaksa shuf untuk beroperasi sebagai daftar shuf.

Penggunaan

Usage: shuf -e [OPTION]... [ARG]...

Cara untuk menentukan argumen daftar

Ketik masukan sebagai argumen

perintah

{
    shuf -e 1 2 3
}

Keluaran

1
3
2

Catatan
(1) above shuf command  shuf -e 1 2 3 is equivalent to seq 3 | shuf –

Variable as args

perintah

{
    var="1 2 3";
    shuf -e ${var}
}

<strong>Output</strong>
[cc lang="bash"]
3
1
2

Ekspansi parameter sebagai argumen

perintah

{
    shuf -e {1..3}
}

Keluaran

1
2
3

Command substitution as args

perintah

{
    shuf -e $( seq 3 )
}

Keluaran

3
2
1

range shuf

Cara shuf yang terakhir ini tidak seperti cara-cara sebelumnya yang diperkenalkan. Alih-alih menentukan file atau argumen di command line, itu membutuhkan rentang bilangan bulat. Opsi -i, memaksa shuf untuk beroperasi sebagai range shuf.
Range shuf menghasilkan rentang bilangan bulat dalam urutan acak.

Penggunaan

Usage: shuf -i LO-HI [OPTION]...

Cara untuk menentukan jangkauan

Satu-satunya cara: LO-HI

perintah

{
    shuf -i 1-3
}

Keluaran

2
3
1

Catatan

(1) Perintah shuf shuf -i 1-3 setara dengan semua perintah sebelumnya menggunakan urutan 1 2 3

Opsi shuf tingkat lanjut

Berikut adalah beberapa opsi lanjutan untuk shuf yang mungkin berguna dalam pemrograman bash.

Limit number of output lines

Untuk membatasi jumlah baris dalam output, kami menggunakan opsi -n diikuti oleh bilangan bulat sebagai berikut.

perintah

{
    shuf -i 1-3 -n 1
}

Keluaran

3

Catatan

  • Perintah shuf shuf -i 1-3 -n 1 setara dengan shuf -i 1-3 | kepala -1

Specify a file to write output lines

Untuk menentukan file untuk menulis baris output, kami menggunakan opsi -o diikuti dengan nama file sebagai berikut.

perintah

{
    shuf -i 1-3 -n 1 -o file;
    cat file;
    rm -f file
}

Keluaran

1

Catatan

(1) File perintah shuf shuf -i 1-3 -n 1 -o setara dengan shuf -i 1-3 -n 1 > file menggunakan pengalihan I/O

Stream output lines

Untuk membuat aliran garis keluaran yang berkelanjutan, kami menggunakan opsi -r sebagai berikut.

perintah

{
    shuf -e {0,1} -r | xargs -i echo -n "{}"
}

Keluaran

000101101010101101010110000101111010001010111001110…

Use the zero byte instead of newline as line delimiter

Untuk menggunakan garis yang diakhiri nol, kami menggunakan opsi -z sebagai berikut.

perintah

{
    seq 3 | tr 'n' ' ' | shuf -z
}

Keluaran

213

Catatan

(1) Output berisi nol byte non-cetak di antara digit

Cara mengocok di bash dengan cara mudah

Cara mudah untuk shuf adalah dengan menggunakan perintah shuf seperti yang dibahas di atas. Namun, jika Anda sedikit penasaran tentang bagaimana Anda akan mengocok jika tidak menggunakan perintah eksternal lain atau bahkan bash murni, baca terus.

Cara mengocok dengan cara yang sulit

Saya telah menyusun daftar cara sulit untuk mengocok. Jangan khawatir mereka tidak terlalu sulit. Mereka hanya tidak menggunakan perintah shuf.

Using sort

Alternatif umum untuk menggunakan file shuf adalah dengan menggunakan perintah sort. Berikut caranya:

perintah

{
    seq 3 | sort -r
}

Keluaran

2
3
1

Catatan

(1) Deret shuf 3 | sort -r setara dengan shuf -i 1-3

(2) shuf -i 1-3 lebih cepat

Using gawk

Alternatif lain untuk menggunakan file shuf adalah dengan menggunakan perintah gawk. Berikut caranya:

Naskah

gawk-shuf() {
  gawk -v random=${RANDOM} '
  function randInt() {
    return int(rand()*1000)
  }
  function case_numeric_compare(i1, v1, i2, v2, l, r) {
    l = int(v1)
    r = int(v2)
    if(l<r) return -1
    else if(l==r) return 0
    else return 1
  }
BEGIN {
  count=1
  srand(random)
}
{
  rank[count]=randInt()
  line[count]=$(0)
  count++
}
END {
asorti(rank,order,"case_numeric_compare")
  for(i=0;i&lt;count;i++) {
    print line[order[i]]
  }
}
' -
}
if [ ${#} -eq 0 ]
then
  true
else
  exit 1 # wrong args
fi
gawk-shuf

Sumber:   gawk-shuf.sh

perintah

{
    seq 3 | bash gawk-shuf.sh
}

Keluaran

2
3
1

Catatan

(1) Anda juga dapat menggunakan awk
(2) gawk-shuf.sh harus ada di direktori kerja perintah

Pure bash

Naskah

pure-bash-shuf() {
local line
local -a lines
while read -r line
do
  lines[RANDOM]=${line}
done
for line in ${lines[@]}
do
  echo ${line}
done
}
if [ ${#} -eq 0 ]
then
  true
else
  exit 1 # wrong args
fi
pure-bash-shuf

Sumber: pure-bash-shuf.sh

perintah

{
    seq 3 | bash pure-bash-shuf.sh
}

Keluaran

2
3
1

Catatan

  • Skrip di atas tidak menangani kasus di mana RANDOM terjadi lebih dari sekali. Itu dibiarkan sebagai latihan.

dJackblck17 Game

Saya telah menyusun awal permainan kartu yang disebut Jackblck17 berdasarkan blackjack untuk tujuan menunjukkan perintah shuf dalam tindakan.

Naskah

deck() {
    echo {A,2,3,4,5,6,7,8,9,10,J,Q,K}-{club,diamond,heart,spade}
}
banner() {
cat << EOF

bbbbbbbb
jjjj     b::::::b  lllllll  kkkkkkkk  1111111  77777777777777777777
j::::j   b::::::b  l:::::l  k::::::k  1::::::1 7::::::::::::::::::7
jjjj     b::::::b  l:::::l  k::::::k  1:::::::1 7::::::::::::::::::7
b:::::b  l:::::l   k::::::k 111:::::1  777777777777:::::::7
jjjjjjj  aaaaaaaaaaaaa  ccccccccccccccccb:::::bbbbbbbbb l::::l
cccccccccccccccc k:::::k    kkkkkkk   1::::1   7::::::7
j:::::j  a::::::::::::a   cc:::::::::::::::cb::::::::::::::bb
l::::l   cc:::::::::::::::c k:::::k   k:::::k    1::::1  7::::::7
j::::j  aaaaaaaaa:::::a c:::::::::::::::::cb::::::::::::::::b  l::::l
c:::::::::::::::::c k:::::k  k:::::k     1::::1  7::::::7
j::::j a::::ac:::::::cccccc:::::cb:::::bbbbb:::::::b l::::l
c:::::::cccccc:::::c k:::::k k:::::k   1::::l  7::::::7
j::::j    aaaaaaa:::::ac::::::c cccccccb:::::b    b::::::b l::::l c::::::c
ccccccc k::::::k:::::k       1::::l          7::::::7
j::::j  aa::::::::::::ac:::::c b:::::b   b:::::b l::::l c:::::c k:::::::::::k
1::::l         7::::::7
j::::j a::::aaaa::::::ac:::::c  b:::::b     b:::::b l::::l c:::::c
k:::::::::::k        1::::l        7::::::7
j::::ja::::a    a:::::ac::::::c   cccccccb:::::b   b:::::b l::::l c::::::c
ccccccc k::::::k:::::k       1::::l       7::::::7
j::::ja::::a    a:::::ac:::::::cccccc:::::cb:::::bbbbbb::::::bl::::::lc:::::::
cccccc:::::ck::::::k k:::::k   111::::::111   7::::::7
j::::ja:::::aaaa::::::a c:::::::::::::::::cb::::::::::::::::b l::::::l
c:::::::::::::::::ck::::::k  k:::::k  1::::::::::1  7::::::7
j::::j a::::::::::aa:::a cc:::::::::::::::cb:::::::::::::::b
l::::::l  cc:::::::::::::::ck::::::k   k:::::k 1::::::::::1 7::::::7
j::::j  aaaaaaaaaa  aaaa   ccccccccccccccccbbbbbbbbbbbbbbbb
llllllll  cccccccccccccccckkkkkkkk kkkkkkk11111111111177777777
j::::j
jjjj      j::::j
j::::jj   j:::::j
j::::::jjj::::::j
jj::::::::::::j
jjj::::::jjj
jjjjjj

EOF
}
score() {
case ${1} in
A) echo 0 ;;
[2-9]|10) echo ${1} ;;
J|Q|K) echo 10 ;;
esac
}
score-hand() {
local card
local points
local -i candidate_points
local -i aces
aces=0
for card in ${hand}
do
let points+=$( score ${card/-*/} )
test ! "${card/-*/}" = "A" || {
let aces+=1
}
done
test ! ${aces} -le 0 || {
echo ${points}
}
while [ ${aces} -gt 0 ]
do
for point in ${points}
do
new_point=""
for ace in 1 11
do
candidate_points=$(( point + ace ))
test ! ${candidate_points} -le 21 || {
echo "${candidate_points}"
new_points="${new_points} ${candidate_points}"
}
done
done
let aces-=1
points="${new_points}"
done | sort -nur | head -1
}
jackblck17() {
local deck
local card
local -i turn
local hand
deck=$( shuf -e $( deck ) )
banner
echo -e " Press enter key to continue"
read
turn=1
for card in ${deck}
do
test ! ${turn} -gt 2 || {
echo -e "nhit or stay? (h) or s "
read
test ! "${REPLY}" = "s" || {
break
}
}
echo -e "n Your hand: n"
hand="${hand} ${card}"
echo " ${hand}"
test ! $( score-hand ) -gt 21 || {
echo -e "nBust!n"
exit
}
let turn++
sleep 1
done
echo -e "Dealer's hand: 17n"
echo -e "Your hand: $( score-hand )n"
test ! $( score-hand ) -gt 17 && {
echo -e "Dealer winsn"
true
} || {
echo -e "You win!n"
}
}
if [ ${#} -eq 0 ]
then
true
else
exit 1 # wrong args
fi
jackblck17

Sumber: jackblck17.sh

perintah

bash jackblck17.sh

Keluaran

bbbbbbbb
jjjj   b::::::b   lllllll  kkkkkkkk 1111111   77777777777777777777
j::::j b::::::b   l:::::l  k::::::k 1::::::1  7::::::::::::::::::7
jjjj   b::::::b   l:::::l  k::::::k 1:::::::1 7::::::::::::::::::7
b:::::b   l:::::l  k::::::k 111:::::1 777777777777:::::::7
jjjjjjj aaaaaaaaaaaaa  ccccccccccccccccb:::::bbbbbbbbb     l::::l
cccccccccccccccc k:::::k    kkkkkkk   1::::1  7::::::7
j:::::j  a::::::::::::a  cc:::::::::::::::cb::::::::::::::bb l::::l
cc:::::::::::::::c k:::::k   k:::::k    1::::1 7::::::7
j::::j  aaaaaaaaa:::::a c:::::::::::::::::cb::::::::::::::::b  l::::l
c:::::::::::::::::c k:::::k  k:::::k     1::::1    7::::::7
j::::j           a::::ac:::::::cccccc:::::cb:::::bbbbb:::::::b l::::l
c:::::::cccccc:::::c k:::::k k:::::k      1::::l           7::::::7
j::::j    aaaaaaa:::::ac::::::c     cccccccb:::::b    b::::::b l::::l
c::::::c     ccccccc k::::::k:::::k       1::::l          7::::::7
j::::j  aa::::::::::::ac:::::c             b:::::b     b:::::b l::::l
c:::::c              k:::::::::::k        1::::l         7::::::7
j::::j a::::aaaa::::::ac:::::c              b:::::b     b:::::b l::::l
c:::::c              k:::::::::::k        1::::l        7::::::7
j::::ja::::a    a:::::ac::::::c     cccccccb:::::b     b:::::b l::::l
c::::::c     ccccccc k::::::k:::::k       1::::l       7::::::7
j::::ja::::a    a:::::ac:::::::cccccc:::::cb:::::bbbbbb::::::bl::::::lc
:::::::cccccc:::::ck::::::k k:::::k   111::::::111   7::::::7
j::::ja:::::aaaa::::::a c:::::::::::::::::cb::::::::::::::::b l::::::l
c:::::::::::::::::ck::::::k  k:::::k  1::::::::::1  7::::::7
j::::j a::::::::::aa:::a cc:::::::::::::::cb:::::::::::::::b  l::::::l
cc:::::::::::::::ck::::::k   k:::::k 1::::::::::1 7::::::7
j::::j  aaaaaaaaaa  aaaa   ccccccccccccccccbbbbbbbbbbbbbbbb
llllllll  cccccccccccccccckkkkkkkk  kkkkkkk11111111111177777777
j::::j
jjjj      j::::j
j::::jj   j:::::j
j::::::jjj::::::j
jj::::::::::::j
jjj::::::jjj
jjjjjj
Press enter key to continue
Your hand:
3-heart

Your hand:</span>
3-heart 4-spade

hit or stay? (h) or (s)

Your hand:
3-heart 4-spade 9-heart

hit or stay? (h) or s
s

Dealer's hand: 17
Your hand: 16

Dealer wins

Intinya pada shuf di bash

Dalam tutorial ini, kami membahas semua yang perlu Anda ketahui tentang perintah shuf dan banyak lagi. Anda tidak lagi harus menghasilkan untuk melakukan hal-hal dengan cara yang sulit, sekarang Anda memiliki shuf.

Sejujurnya, sebelum menulis ini, saya hanya tahu sedikit bahwa ada perintah yang disebut shuf yang dapat digunakan untuk mengacak urutan input yang diberikan. Setelah menyelam jauh ke dalam perintah shuf untuk pemrograman bash, Sekarang, saya dapat dengan jujur ​​mengatakan bahwa itu sepadan; shuf lebih berguna dari yang saya kira.

Saya harap Anda menikmati membaca ini sama seperti saya menikmati menulisnya dan itu membantu Anda dalam karir atau pekerjaan rumah Anda. Jika ya, beri tahu saya.

Terima kasih,

Related Posts