这是我的代码:
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 :(得分: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(<(...)
位),你可以这样做 - 但是循环体不能在外部脚本中产生任何副作用(例如一旦循环完成,它设置的任何变量都不会再设置):
#!/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
答案 1 :(得分: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)
答案 2 :(得分: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
上面的命令打印从文件开头开始的所有行的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
>
答案 3 :(得分:0)
shuf将以随机顺序生成文件;如果你知道你想要多少行,你可以将它赋予-n参数。不需要一次一个。所以:
shuf -n $(( $(wc -l < $FILE) * $PCT / 100 )) "$file" |
while read line; do
# do something with $line
done
shuf标配GNU / Linux发行版afaik。