separando colunas do comando em um novo comando

1

Estou tentando criar um script para criação automática de dispositivos. Já estou muito longe, mas estou preso em um ponto.

O arquivo de origem é assim:

dev1 size 1024
dev2 size 1024
dev3 size 1024
dev4 size 512
dev5 size 512

No script, o arquivo de origem é a variável $ INVFILE. Então eu emito o comando

cat $INVFILE | awk '{print $3}' | sort | uniq -c

O que dá a seguinte saída:

   3 1024
   2 512

Eu quero usar essa saída no seguinte comando, para que ela use os diferentes tamanhos e suas contagens (para este exemplo, estou usando apenas a primeira linha, mas no script, quero usar as duas linhas em um tipo de "para eu em" função).

create dev count=3 size=1024MB

Como posso fazer isso no script? E há uma maneira mais fácil em vez da função "para eu entrar"?

    
por Marty 01.06.2016 / 16:24

3 respostas

0
awk '{print $3}' $INVFILE | sort | uniq -c | \
while read a b ; do \
    create dev count=$a size=${b}MB ; \
done

para usa apenas um item da lista por ciclo de loop, enquanto que x_1 x_2 x_3 ... usa, no entanto, muitos x_n s existem, (mas nunca mais itens do que acontece em uma linha do arquivo de entrada).

Nota, se qualquer uma das entradas tiver mais de duas colunas, altere 'leia ab' acima para 'ler abc' - o $ c não seria usado no loop, mas impede que a leitura atribua o restante da linha a $ b .

A primeira linha de canais pode ser trocada por datamash , com $ a & $ b foi trocado no loop:

datamash -W -s -g3 count 3 < $INVFILE | \
while read a b ; do \
    create dev count=$b size=${a}MB ; \
done
    
por 01.06.2016 / 16:32
4

o awk pode fazer todo o trabalho.

tente

awk '{ d[$3]++ ; } 
     END { for ( c in d ) 
        printf "create dev count=%d size=%dMB\n",d[c],c ;}' $INVFILE

e se funcionar:

awk '{ d[$3]++ ; } 
   END { for ( c in d ) 
         printf "create dev count=%d size=%dMB\n",d[c],c ;}' $INVFILE |
bash
    
por 01.06.2016 / 16:43
0

Primeiro de tudo, o comando 'uniq' - tem uma opção para ignorar n colunas: '-f N'.

Depois você pode colocar campos de uma entrada em variáveis com 'read'.

Portanto, no total, o comando a seguir selecionará as informações necessárias de todas as linhas do arquivo de entrada:

cat input.txt | uniq -f2 -c | while read a b c d; do echo "command $a $d" ;done

Substitua "echo ..." por seu comando.

    
por 01.06.2016 / 16:41