在shell脚本中从文件中读取随机行有什么简单的方法?


当前回答

一个解决方案,也适用于MacOSX,应该也适用于Linux(?):

N=5
awk 'NR==FNR {lineN[$1]; next}(FNR in lineN)' <(jot -r $N 1 $(wc -l < $file)) $file 

地点:

N是你想要的随机行数 NR = = FNR{亚麻(1美元);next}(亚麻中的FNR) file1 file2 ——>保存file1中写入的行号,然后打印file2中相应的行 jot -r $N 1 $(wc -l < $file)——>在(1,number_of_line_in_file)范围内随机抽取N个数字(-r)。进程替换<()将使它看起来像解释器的文件,即前面示例中的file1。

其他回答

perlfaq5:我如何从文件中选择一个随机的行?下面是Camel Book上的一个油藏采样算法:

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

与读取整个文件相比,这在空间上有很大的优势。你可以在Donald E. Knuth的《计算机编程艺术》第2卷第3.4.2节中找到这种方法的证明。

单个bash行:

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

小问题:重复的文件名。

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

(我更喜欢上面的shiff方法——我甚至不知道它的存在,我自己也永远不会找到这个工具)

另一种使用awk的方法

awk NR==$((${RANDOM} % `wc -l < file.name` + 1)) file.name

一个解决方案,也适用于MacOSX,应该也适用于Linux(?):

N=5
awk 'NR==FNR {lineN[$1]; next}(FNR in lineN)' <(jot -r $N 1 $(wc -l < $file)) $file 

地点:

N是你想要的随机行数 NR = = FNR{亚麻(1美元);next}(亚麻中的FNR) file1 file2 ——>保存file1中写入的行号,然后打印file2中相应的行 jot -r $N 1 $(wc -l < $file)——>在(1,number_of_line_in_file)范围内随机抽取N个数字(-r)。进程替换<()将使它看起来像解释器的文件,即前面示例中的file1。