sed를 사용하여 목록에서 무작위 항목 5개 검색

sed를 사용하여 목록에서 무작위 항목 5개 검색

sed를 사용하여 목록에서 무작위로 선택된 5개의 항목을 어떻게 검색할 수 있나요? 내 목록은 아래와 같습니다. 각 항목은 줄 시작 부분에 별표로 시작됩니다.

* asterisk*
star
wildcard
* bee
hive
* car
tire
drive
* dove
white
peace
* eel
slippery
* fin
fish
* goat
* hinge
door
* ice
cold
* jam
bread

나는 다음과 같은 무작위 5가지 항목을 원합니다.

* hinge
door
* ice
cold
* jam
bread
* asterisk*
star
wildcard
* eel
slippery

어떻게 해야 합니까?

저는 OSX를 사용하고 있는데 sed에서 세미콜론을 사용할 수 없었고 shuf 대신 gshuf를 사용해야 했습니다. 나는 이것을 시도했다:

sed -e '1b' -e 's/^*/\x0*/' mypath | gshuf -zn 5 | tr -d '\000'

하지만 null 문자 대신 리터럴 "x0"을 추가한 것 같고 다음과 같은 결과가 나왔습니다.

* asterisk*
star
wildcard
x0* bee
hive
x0* car
tire
drive
x0* dove
white
peace
x0* eel
slippery
x0* fin
fish
x0* goat
x0* hinge
door
x0* ice
cold
x0* jam
bread

이에 대한 해결 방법이 있나요?

답변1

와 함께 gnu sed/shuf:

sed '1b;s/^*/\x0*/' infile | shuf -zn 5 | tr -d '\000'

이는 입력을 nul 분리 레코드로 변환합니다. 즉, a로 시작하는 각 줄 *(첫 번째 줄 제외)에서 nul 문자를 추가한 다음 with 스위치를 *사용하여 5개의 무작위 레코드를 추출하고 해당 nul 문자를 삭제합니다.shuf--zero-terminatedtr

답변2

cat listfile | tr '\n' , | sed 's/,\*/\n*/g;s/,$//' | shuf | head -n 5 | tr , '\n'

관련 정보