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-terminated
tr
답변2
cat listfile | tr '\n' , | sed 's/,\*/\n*/g;s/,$//' | shuf | head -n 5 | tr , '\n'