Você pode usar a expansão de parâmetro bash
${parameter:offset:length}
formulário com matriz:
$ array=($(seq 20))
$ printf "%s " "${a[@]: -12}"
9 10 11 12 13 14 15 16 17 18 19 20
Estou tendo um momento loiro.
Estes são meus dados de myfile.csv
1429829254,e,SE,StckXchg,HDCU3000623,d,scan,253,47968,94,1420824420,JSSE-213,199,BS,KIT,*OUT*
1429897704,e,SE,StckXchg,HDCU3000623,d,scan,253,68496104,103,1420923818,SP-TMX6BP-101-112Z,*OUT*
1429897718,e,SE,StckXchg,HDCU3000623,d,scan,253,68510090,104,1420923832,02132,*OUT*
1429897767,e,SE,StckXchg,HDCU3000623,d,scan,253,68559085,105,1420923878,02132,*OUT*
1429912759,e,SE,StckXchg,HDCU3000623,d,scan,255,47966,107,1420924040,JSF-1,4"MEG0004,*OUT*
1429912766,e,SE,StckXchg,HDCU3000623,d,scan,255,54955,108,1420924047,02134,*OUT*
1429982863,e,SE,StckXchg,HDCU3000623,d,scan,256,47965,120,1420987942,JSDL-JA120901S,*OUT*
1429982870,e,SE,StckXchg,HDCU3000623,d,scan,256,54953,121,1420987961,02132,*OUT*
1429982877,e,SE,StckXchg,HDCU3000623,d,scan,256,61954,109,1420971277,02134,*OUT*
Atualmente, coloco esses dados em uma matriz e extrai cada um dos elementos individualmente.
Mas nossos dados de entrada foram alterados e agora os elementos com uma linha podem variar e podem variar muito. Eu estava curioso para saber como extrair dados da amostra acima, do 12º elemento até o último elemento.
Com o meu código, isso é o que eu faço:
cat $out_file_name | while read line
do
awk_var='echo "$line" | awk -F"," '{print $1, $5, $10, $12, $13, $14}'' #Get the appropriate arguments
awk_var_array=($awk_var)
timestamp=${awk_var_array[0]}
container==${awk_var_array[1]}
scan_id=${awk_var_array[2]}
part_no=${awk_var_array[3]}
direction=${awk_var_array[4]}
#further processing and send the above to a mysql table
done
mas agora isso obviamente não funciona. Então eu preciso encontrar uma maneira de armazenar todo o elemento do 12º elemento até o último elemento (in / out).
seria feito com um loop for? Algo assim talvez?
for element_count in $(seq 13 $({#awk_var_array[@]}-1))
do
var_name=my_var_''$element_count
$var_name=${awk_var_array[element_count]
done
Com base nas informações adicionais que recebemos dos vários comentários, acho que tudo o que você precisa é desse código:
while IFS=, read timestamp x x x container x x x x scan_id x part_no direction rest
do
# compose SQL command using "${timestamp}" "${container}" ... "${direction}" "${rest}" and send it to mysql database
done < "${out_file_name}"
Nota: Os x
no comando de leitura representam campos fictícios que serão ignorados (e não atribuídos a um identificador único), e a variável rest
contém todos os campos em uma variável além daqueles explicitamente enumerados no read
lista de argumentos.