N개 행의 각 블록에서 행을 무작위로 선택합니다.

N개 행의 각 블록에서 행을 무작위로 선택합니다.

주어진 행 수 이후에 행을 무작위로 선택하고 싶습니다. 예를 들어, 이것은 내 입력입니다.

8 blue
8 red
8 yellow
8 orange
3 pink
3 white
3 cyan
3 purple
1 magenta
1 black
1 green
1 brown

4개 행마다 무작위로 하나의 행을 선택하면 내 출력은 다음과 같습니다.

8 orange
3 pink
1 green

내가 생각 해낸 최고는 다음과 같습니다.

awk '!(NR%4){a=NR+4};NR<=a|"shuf -n 1"'

하지만 작동하지 않습니다.

답변1

GNU 구현으로split주문하다:

split -l 4 --filter='shuf -n1' inputfile
  • -l N- N출력 파일당 라인/레코드 배치
  • --filter=COMMAND- 쉘에 쓰기 COMMAND파일 이름은 다음과 같습니다.$FILE

답변2

n=4개 행마다 p=1개 행을 무작위로 선택합니다.

awk -v n=1000 -v p=50 '
  BEGIN {srand(); remaining = p}
  NR > n {remaining = p; NR = 1}
  rand()*(n + 1 - NR) < remaining {
    print; remaining--
  }' < your-file

4줄마다 awkGNU를 호출 하려면 shuf다음이 필요합니다.

awk -v cmd="shuf -n 1" '{print | cmd}; NR % 4 == 0 {close(cmd)}'

그러나 이는 파일의 4줄마다 하나의 명령을 실행하는 것을 의미하며 sh이는 훨씬 덜 효율적입니다.shuf

관련 정보