これは私のコードです:
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%(これはパラメーターです)
ありがとうございました。
これは私のコードです:
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% がランダムに取得されます。
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
これを試して:
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
上記のコマンドは、ファイルの先頭から始まるすべての行の 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
>
shuf はランダムな順序でファイルを生成します。必要な行数がわかっている場合は、それを -n パラメータに指定できます。一度に 1 つずつ取得する必要はありません。そう:
shuf -n $(( $(wc -l < $FILE) * $PCT / 100 )) "$file" |
while read line; do
# do something with $line
done
shuf は GNU/Linux ディストリビューションに標準で付属しています。