2010-09-06 4 views
1

comment puis-je facilement (rapide et sale) changer, disons 10, lignes aléatoires d'un fichier avec un shellscript simple?changer la ligne aléatoire avec shellscript

i bien d'abuser ed et générer des commandes aléatoires et plages ligne, mais je voudrais savoir s'il y avait une meilleure façon

Répondre

2
awk 'BEGIN{srand()} 
{ lines[++c]=$0 } 
END{ 
    while(d<10){ 
    RANDOM = int(1 + rand() * c) 
    if(!(RANDOM in r) ) { 
    r[RANDOM] 
    print "do something with " lines[RANDOM] 
    ++d 
    } 
    } 
}' file 

ou si vous avez la commande shuf

shuf -n 10 $file | while read -r line 
do 
    sed -i "s/$line/replacement/" $file 
done 
+1

Vous voulez probablement faire ceci: 'begin {srand()}' –

2

Cela semble être un peu plus rapide:

file=/your/input/file 
c=$(wc -l < "$file") 
awk -v c=$c 'BEGIN { 
        srand(); 
        for (i=0;i<10;i++) lines[i] = int(1 + rand() * c); 
        asort(lines); 
        p = 1 
      } 
      { 
       if (NR == lines[p]) { 
        ++p 
        print "do something with " $0 
       } 
       else print 
      }' "$file" 

I

+1

peut vous expliquer pourquoi la commande shuf ne garde pas l'ordre? shuf sort juste 10 lignes aléatoires, puis utilise sed pour changer chacune d'entre elles. Pas efficace mais je peux dire. – ghostdog74

+0

@ ghostdog74: Je ne suis pas sûr de comprendre. 'shuf' est court pour" shuffle "et c'est ce que ça fait. –

+0

oui, mais shuf -n 10 obtient 10 lignes aléatoires du fichier. – ghostdog74

2

Jouant sur la version @Dennis, cela toujours sortie 10. Faire des nombres aléatoires dans un tableau distinct pourrait créer des doublons et, par conséquent, moins de 10 modifications.

file=~/testfile 
c=$(wc -l < "$file") 
awk -v c=$c ' 
BEGIN { 
     srand(); 
     count = 10; 
    } 

    { 
     if (c*rand() < count) { 
      --count; 
      print "do something with " $0; 
     } else 
      print; 
     --c; 
    } 
' "$file" 
+0

Brillante idée. –

Questions connexes