изменить случайную строку с помощью шеллскрипта - PullRequest
1 голос
/ 06 сентября 2010

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

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

Ответы [ 3 ]

2 голосов
/ 06 сентября 2010

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

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

2 голосов
/ 07 сентября 2010

Воспроизведение версии @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"
2 голосов
/ 06 сентября 2010
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
...