리눅스 shuf 명령에 대해서 간단하게 알아보겠습니다.

 


 shuf는 random한 permutation을 생성합니다. 예를 들어, [1, 2, 3, 4, 5]가 있으면 [2, 1, 3, 5, 4]가 나올 수도 있고, [2, 3, 1, 4, 5]가 나올 수도 있어요. 이를 이용합니다.

 

 

 먼저 -i 옵션을 보겠습니다. LO-HI를 주면, LO-HI까지의 각각의 숫자를 input line으로 간주해요. 다음에 -n은 출력하는 줄 수를 지정하는데요. 1부터 46까지 숫자 중에 6개를 중복 없이 뽑아보겠습니다.

 

 

 이 경우, shuf -i 1-46 -n 6을 입력하시면 됩니다. 수 1부터 46까지를 input으로 간주하고, 6개를 뽑습니다. 즉, 1 ~ 46중 6개를 뽑는 것과 같아요.

 

 이제 -e 옵션을 볼게요. -e는 각각의 ARG를 input line으로 간주해요. 예를 들어, 아래와 같이 입력해 볼게요.

 

 shuf -e GH MAL을 입력하였는데요. GH와 MAL을 shuffle의 인풋으로 간주해요. 랜덤하게 섞으면 MAL, GH가 나올 수도 있고, GH, MAL이 나올 수도 있어요. 위 결과는 이를 보여줍니다.

 

 

 ARG에 {a..e} 혹은 {A..E}와 같이 줄 수도 있습니다. 전자는 a, b, c, d, e를 shuffle의 인풋으로 간주하겠다는 의미입니다. 후자는 A, B, C, D, E를 shuffle의 인풋으로 간주하겠다는 의미입니다. 즉, a, b, c, d, e, A, B, C, D, E가 인풋으로 들어가게 되고, 이를 shuffle 하게 되므로, 결과 중 하나는 위와 같이 나오게 됩니다. 물론 이들을 개행문자 없이 붙이고 싶다면, tr -d 명령을 이용하면 됩니다.

 

 

 개행 문자만 제거하면 되기 때문에 tr -d '\n' 명령어를 이용하였습니다.


 이제 쓸만한 예제 중 하나를 보겠습니다. 0보다 크고 20보다 작거나 같은 짝수를 랜덤하게 하나를 뽑아봅시다. 어떻게 하면 될까요? 짝수는 2의 배수입니다. 2는 2에 1을 곱하면 되고, 20은 2에 10을 곱하면 됩니다. 따라서, 1부터 10까지의 수 중 하나를 먼저 뽑은 다음에, 그 결과에 2를 곱하면 됩니다.

 

 하나씩 볼게요. $(shuf -i 1-10 -n 1)은 1부터 10까지의 정수들을 shuffle한 결과 중 1번째 것을 뽑습니다. 이 값에 2를 곱해요. 다음에 $(())를 씌웠는데요. 이는 정수로 convert를 함을 의미해요. 고로 해당 명령은, 2부터 20까지의 짝수를 랜덤하게 하나 뽑는 것과 같습니다.

 

 생각보다 shuffle은 쓸 일이 많으니, 알아두면 좋을 듯 싶습니다.