Ok, pensando duas vezes - eu trabalhei muito maneira nisso. Você só precisa disso:
shuf -i 1-100 -n10 |
sed 's/$/{p;b\n}/' |
sed -nf - -e 'w separate_file' infile >outfile
Embora você possa precisar de uma nova linha literal no lugar do n
na substituição sed
. De qualquer forma, isso faz o mesmo que abaixo - ele simplesmente não se incomoda em fazer todas as outras 90 linhas - eles apenas se encaixam porque estão no arquivo - então eles não precisam de nenhuma consideração especial.
Este é o negócio todo:
set " $(shuf -i 1-100 -n 10) "
while [ "$((i+=1))" -le 100 ]
do [ -z "${1##*[!0-9]$i[!0-9]*}" ]
printf "$i%.$((!$?))s%.$?s\n" p H
done| sed -nf - -e '$!d;x;s/.//p' <infile >outfile
Existe basicamente basicamente um script sed
semelhante a:
1H
2H
3H
4p
5H
...
90p
91H
...
E assim por diante até 100. Na última linha - depois que todas as linhas selecionadas aleatoriamente já tiverem sido p
rinted, nós e x
mudaremos para H
old space, s///
ubstituiremos o primeiro inseriu \n
ewline character, e p
rint o lote do resto.
Para fazer isso sem o loop de shell, você pode fazer:
set "$(shuf -i 1-100 -n 10)"
{ seq 100 | grep -Fxv "$1"; echo "$1"; } |
sed '1,90s/$/H/;91,$s/$/p/' |
sed -nf - -e '$!d;x;s/.//p' <infile >outfile
Mas não tenho certeza se nessa escala isso seria benéfico.
De qualquer forma, usei um arquivo de saída seq 100
como teste e, depois de executá-lo, imprimi ...
3
4
5
19
57
63
64
73
80
88
1
2
6
7
8
9
10
11
12
13
14
15
16
...
... e até 100 para todas as linhas não incluídas no aleatório inicial 100.