1

これは私のコードです:

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

4 に答える 4

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")

コマンド置換 (ビット) なしでシェルを使用している場合は<(...)、これを行うことができます。ループが完了したら、もう設定しません):

#!/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
于 2012-09-28T10:04:53.877 に答える
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)
于 2012-09-28T09:59:13.177 に答える
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
>
于 2012-09-28T10:01:20.657 に答える
0

shuf はランダムな順序でファイルを生成します。必要な行数がわかっている場合は、それを -n パラメータに指定できます。一度に 1 つずつ取得する必要はありません。そう:

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

shuf は GNU/Linux ディストリビューションに標準で付属しています。

于 2012-09-29T03:51:13.730 に答える