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


当前回答

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

其他回答

单个bash行:

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

小问题:重复的文件名。

使用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}
#!/bin/bash

IFS=$'\n' wordsArray=($(<$1))

numWords=${#wordsArray[@]}
sizeOfNumWords=${#numWords}

while [ True ]
do
    for ((i=0; i<$sizeOfNumWords; i++))
    do
        let ranNumArray[$i]=$(( ( $RANDOM % 10 )  + 1 ))-1
        ranNumStr="$ranNumStr${ranNumArray[$i]}"
    done
    if [ $ranNumStr -le $numWords ]
    then
        break
    fi
    ranNumStr=""
done

noLeadZeroStr=$((10#$ranNumStr))
echo ${wordsArray[$noLeadZeroStr]}

一个解决方案,也适用于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。

你可以使用shuf:

shuf -n 1 $FILE

还有一个实用程序叫做rl。在Debian中,它是在随机行包中,尽管不是在所有发行版中都可用,但它确实是你想要的。在它的主页上,它实际上推荐使用shuf(我相信它创建时还不存在)。shuf是GNU coreutils的一部分,rl不是。

rl -c 1 $FILE