这是我的代码:获取线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%(这是一个参数)
谢谢。
这是我的代码:获取线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%(这是一个参数)
谢谢。
试试这个:
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)
你可以用下面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
>
OP要求随机线,并不总是前20%。 –
这将随机得到的文件中的行的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
shuf将以随机顺序产生文件;如果你知道你想要多少行,你可以将它赋给-n参数。无需一次获得一个。所以:
shuf -n $(($(wc -l < $FILE) * $PCT/100)) "$file" |
while read line; do
# do something with $line
done
shuf标准的GNU/Linux发行版afaik。
做 线= $(头 - $(($ {} RANDOM%$ nb_lignes))$文件|尾-1) 回声 “$线” 做 - >难道这些线路distincts或可能被复制? – user1543915
他们可以复制 – dogbane
请你能解释更多你的想法,我希望他们区别不重复,谢谢 – user1543915