随机获取文件中20%的行

时间:2012-09-28 09:48:10

标签: shell

这是我的代码:

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%(这是一个参数)

谢谢。

4 个答案:

答案 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。