주어진 행 수 이후에 행을 무작위로 선택하고 싶습니다. 예를 들어, 이것은 내 입력입니다.
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줄마다 awk
GNU를 호출 하려면 shuf
다음이 필요합니다.
awk -v cmd="shuf -n 1" '{print | cmd}; NR % 4 == 0 {close(cmd)}'
그러나 이는 파일의 4줄마다 하나의 명령을 실행하는 것을 의미하며 sh
이는 훨씬 덜 효율적입니다.shuf