Reimprime uma matriz em um determinado formato?

1

Eu quero pegar 10 linhas aleatórias de arquivo, com 100 linhas de comprimento. Primeiro, eu gero aleatoriamente 10 inteiros entre 1 e 100 (inclusive) com

ind=$(shuf -i 1-100 -n 10 | sort -n)

Depois, desejo usar sed para extrair essas linhas (indicadas por ind ). Então eu preciso reimprimir a matriz ind para gerar

<ind(1)>p;<ind(2)>p;...;<ind(10)>p

como em

sed -n '<ind(1)>p;<ind(2)>p;...;<ind(10)>p' ~/orig.txt > ~/short.txt

Como posso fazer isso?

    
por Sibbs Gambling 27.05.2015 / 18:38

3 respostas

3

No seu exemplo, ind é uma string, não uma matriz. Você deve usar:

ind=($(shuf -i 1-100 -n 10 | sort -n))

para tornar ind array (na matriz de suporte do shell como bash , zsh , ksh ).

Simplesmente, você pode tentar:

$ printf '%sp\n' $(shuf -i 1-100 -n 10 | sort -n) > /tmp/short.sed
$ sed -n -f /tmp/short.sed < orig.txt > short.txt
    
por 27.05.2015 / 18:50
2

Uma solução baseada em awk (sem necessidade de classificação):

awk 'NR==FNR{a[$1];next} NR in a' <(shuf -i 1-100 -n 10) ~/orig.txt > ~/short.txt

E uma variante awk do GNU puro (sem necessidade de outros processos externos):

awk '
  BEGIN { srand(); do a[int(100*rand()+1)]; while (length(a)<10) }
  NR in a
' ~/orig.txt > ~/short.txt
    
por 27.05.2015 / 19:07
0

Em vez de tentar percorrer um longo caminho e criar um script sed para extrair as linhas do seu arquivo, use apenas shuf diretamente:

shuf -n 10 ~/short.txt

Se você quiser as linhas na ordem em que elas são encontradas no arquivo original:

cat -n ~/short.txt | shuf -n 10 | sort -n | cut -f 2-

Enumera as linhas no arquivo, extrai 10 linhas dele (em ordem aleatória), classifica as linhas extraídas e remove a numeração.

    
por 01.08.2018 / 13:20