2012-09-28 52 views
1

这是我的代码:获取线20%的文件随机

nb_lignes=`wc -l $1 | cut -d " " -f1` 
for i in $(seq $nb_lignes) 
do 
m=`head $1 -n $i | tail -1` 
//command 
done 

请我怎样才能改变它得到获取文件随机行的20%,适用于每行“命令”? 20%或40%或60%(这是一个参数)

谢谢。

回答

0

试试这个:

file=$1 
nb_lignes=$(wc -l $file | cut -d " " -f1) 
num_lines_to_get=$((20*${nb_lignes}/100)) 
for ((i=0; i < $num_lines_to_get; i++)) 
do 
    line=$(head -$((${RANDOM} % $nb_lignes)) $file | tail -1) 
    echo "$line" 
done 

注意${RANDOM}只生成数小于32768所以这种方法不会对大文件的工作。

如果您安装了shuf,则可以使用以下命令获取随机行而不是使用$RANDOM

line=$(shuf -n 1 $file) 
+0

做 线= $(头 - $(($ {} RANDOM%$ nb_lignes))$文件|尾-1) 回声 “$线” 做 - >难道这些线路distincts或可能被复制? – user1543915

+0

他们可以复制 – dogbane

+0

请你能解释更多你的想法,我希望他们区别不重复,谢谢 – user1543915

0

你可以用下面awk.see做到这一点:

awk -v b=20 '{a[NR]=$0}END{val=((b/100)*NR)+1;for(i=1;i<val;i++)print a[i]}' all.log 

上面的命令打印从文件的begining开始的所有行的20%。

您只需在命令行上更改b的值即可获得所需的行数。 以下测试:

> cat temp 
1 
2 
3 
4 
5 
6 
7 
8 
9 
10 
> awk -v b=10 '{a[NR]=$0}END{val=((b/100)*NR)+1;for(i=1;i<val;i++)print a[i]}' temp 
1 
> awk -v b=20 '{a[NR]=$0}END{val=((b/100)*NR)+1;for(i=1;i<val;i++)print a[i]}' temp 
1 
2 
> 
+0

OP要求随机线,并不总是前20%。 –

1

这将随机得到的文件中的行的20%:

awk -v p=20 'BEGIN {srand()} rand() <= p/100' filename 

因此,像这样的整体解决方案(假设的bash):

#!/bin/bash 
filename="$1" 
pct="${2:-20}"  # specify percentage 
while read line; do 
    : # some command with "$line" 
done < <(awk -v p="$pct" 'BEGIN {srand()} rand() <= p/100' "$filename") 

如果你使用没有命令替换的shell(<(...)位),你可以这样做 - 但是循环的主体将不能在外部s中产生任何副作用cript(例如它设置的任何变量在循环完成后将不会再设置):

#!/bin/sh 
filename="$1" 
pct="${2:-20}"  # specify percentage 
awk -v p="$pct" 'BEGIN {srand()} rand() <= p/100' "$filename" | 
while read line; do 
    : # some command with "$line" 
done 
0

shuf将以随机顺序产生文件;如果你知道你想要多少行,你可以将它赋给-n参数。无需一次获得一个。所以:

shuf -n $(($(wc -l < $FILE) * $PCT/100)) "$file" | 
while read line; do 
    # do something with $line 
done 

shuf标准的GNU/Linux发行版afaik。