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


当前回答

另一种使用awk的方法

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

其他回答

另一个选择:

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

这很简单。

cat file.txt | shuf -n 1

当然,这只是比“shuf -n 1 file.txt”本身稍微慢一点。

单个bash行:

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

小问题:重复的文件名。

以下是我的发现,因为我的Mac OS不使用所有简单的答案。我使用jot命令来生成一个数字,因为$RANDOM变量解决方案在我的测试中似乎不是很随机。当测试我的解决方案时,我在输出中提供的解决方案中有很大的差异。

  RANDOM1=`jot -r 1 1 235886`
   #range of jot ( 1 235886 ) found from earlier wc -w /usr/share/dict/web2
   echo $RANDOM1
   head -n $RANDOM1 /usr/share/dict/web2 | tail -n 1

变量的回声是为了得到生成的随机数的视觉效果。

使用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}