2016-10-27 5 views
1

У меня есть текстовый файл в следующем формате, алфавиты являются идентификаторами, разделенными пробелом.Случайный выбор идентификаторов из файла

OG1: A B C D E 
OG2: C F G D R 
OG3: A D F F F 

Я хотел бы случайно извлечь один идентификатор из каждой группы,

OG1: E 
OG2: D 
OG3: A 

Я попытался с помощью

shuf -n 1 data.txt 

, который дает мне

OG2: C F G D R 

ответ

2

awk к rescu е!

$ awk -v seed=$RANDOM 'BEGIN{srand(seed)} {print $1,$(rand()*(NF-1)+2)}' file 

OG1: D 
OG2: F 
OG3: F 

пропустить определенное письмо, вы можете изменить основной блок

... {while ("C"==r=$(rand()*(NF-1)+2)); print $1,r}' file 
+0

это дает случайный выбор между разными прогонами ++ – Sundeep

+0

Можно ли всегда избегать одного ar алфавит из случайного выбора, скажем, «C» в этом случае? – Paul

+0

см. Обновление. – karakfa

2

perl -lane 'print "$F[0] ".$F[rand($#F-1)+1]' data.txt

Объяснение:

используются эти параметры командной строки:

  • -n петля вокруг каждой строки входного файла
  • -l удаляет символы новой строки перед обработкой, и добавляет их обратно впоследствии
  • -a режима Autosplit - сплит входных линий в @F массив. По умолчанию разбивается на пробелы.
  • -e выполнить код Perl

@F является массив слов в каждой строке, индексной начиная с $F[0]
$#F это количество слов в @F

выход:

OG1: A 
OG2: F 
OG3: F