[linux] 유닉스 명령 줄의 파일에서 임의의 줄을 읽는 쉬운 방법은 무엇입니까?

유닉스 명령 줄의 파일에서 임의의 줄을 읽는 쉬운 방법은 무엇입니까?



답변

당신은 사용할 수 있습니다 shuf:

shuf -n 1 $FILE

라는 유틸리티도 있습니다 rl. 데비안에서는 randomize-lines모든 배포판에서 사용할 수는 없지만 원하는 것을 정확하게 수행 하는 패키지에 있습니다. 홈페이지에서 실제로 shuf대신 사용하는 것이 좋습니다 (생성 될 때 존재하지 않았 음). shufGNU coreutils의 일부입니다 rl.

rl -c 1 $FILE


답변

다른 대안 :

head -$((${RANDOM} % `wc -l < file` + 1)) file | tail -1


답변

sort --random-sort $FILE | head -n 1

(나는 위의 shuf 접근법을 더 좋아한다. 나는 그것이 존재한다는 것을 몰랐고 나는 그 도구를 내 자신에서 결코 찾지 못했을 것이다)


답변

이것은 간단합니다.

cat file.txt | shuf -n 1

이것은 “shuf -n 1 file.txt”자체보다 조금 느리다는 것을 알 수 있습니다.


답변

perlfaq5 : 파일에서 임의의 줄을 어떻게 선택합니까? Camel Book의 저수지 샘플링 알고리즘은 다음과 같습니다.

perl -e 'srand; rand($.) < 1 && ($line = $_) while <>; print $line;' file

이것은 전체 파일을 읽는 것보다 공간에서 중요한 이점이 있습니다.이 방법의 증거는 Donald E. Knuth의 3.4.2 절, 컴퓨터 프로그래밍 기술 (Art of Computer Programming, Volume 2)에서 확인할 수 있습니다.


답변

bash 스크립트를 사용하여 :

#!/bin/bash
# replace with file to read
FILE=tmp.txt
# count number of lines
NUM=$(wc - l < ${FILE})
# generate random number in range 0-NUM
let X=${RANDOM} % ${NUM} + 1
# extract X-th line
sed -n ${X}p ${FILE}


답변

단일 배쉬 라인 :

sed -n $((1+$RANDOM%`wc -l test.txt | cut -f 1 -d ' '`))p test.txt

약간의 문제 : 파일 이름이 중복되었습니다.