2010-09-06 2 views
1

как я могу (быстро и грязно) изменить, скажем 10, случайные строки файла с простым shellscript?изменить случайную строку с shellscript

я, хотя о злоупотреблении ред и генерации случайных команд и диапазонов линии, но я хотел бы знать, если есть лучший способ

ответ

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 

или если у вас есть команда shuf

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

Вы, вероятно, хотите сделать это: 'BEGIN {srand()}' –

2

Это, кажется, совсем немного быстрее:

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

вы можете объяснить, почему Шуфом команда не поддерживать порядок? shuf просто выводит 10 случайных строк, затем использует sed для изменения каждого из них. Я не могу сказать. – ghostdog74

+0

@ ghostdog74: Я не уверен, что понимаю. 'shuf' не подходит для« shuffle », и это то, что он делает. –

+0

Да, но shuf -n 10 получает 10 случайных строк из файла. – ghostdog74

2

Игра от версии @Dennis', это будет всегда выход 10. Ведение случайных чисел в отдельном массиве может создать дубликаты и, следовательно, меньше, чем 10 модификаций.

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

Блестящая идея. –