O comando
awk -F, 'NR==1 { for (i=1; i<=NF; i++) sn[i]=$i }
NR==2 { for (i=1; i<=NF; i++) print sn[i] "=" $i; exit }' states
onde states
é o seu arquivo, será exibido
Alabama=1000
Alaska="1 0 0 1"
Arizona=1002
Arkansas=1002
California=1003
Colorado=1004
Connecticut=1005
Delaware="1 0 0 6"
Florida=1007
Georgia=1008
Hawaii=1009
Idaho=1010
Illinois=1011
Indiana=1012
Iowa=1013
-
O separador de campos
-F,
setsawk
para,
. -
NR==1
significa “faça o seguinte apenas no primeiro registro (linha)”;NR==2
significa a segunda linha. - O (primeiro)
for
de loop examina cada campo na primeira linha e atribui os valores (nomes de estado) àsn
array:sn[1]=Alabama
,sn[2]=Alaska
,…). - O segundo loop
for
examina cada campo (delimitado por vírgula) na segunda linha e o associa ao nome do estado correspondente (da primeira linha) e a=
, como mostrado acima. - Então,
exit
, entãoawk
não precisa ler o restante do arquivo.
Então
eval $(awk -F, 'NR==1 { for (i=1; i<=NF; i++) sn[i]=$i } NR==2 { for (i=1; i<=NF; i++) print sn[i] "=" $i; exit }' states)
irá capturar essa saída e interpretá-la como uma série de comandos. Feito.
Se você está determinado a usar um loop de shell e o comando cut
, considere
values=$(sed -n '2p;2q' states)
counter=1
for state_name in $(sed 's/,/ /g;1q' states)
do
eval $state_name=$(echo "$values" | cut -d, -f$counter)
counter=$((counter+1))
done
Ou você poderia listar os nomes de estado explicitamente, como você fez em seu exemplo / tentativa
(%código%).
Mas por que você deseja duplicar seus dados em seu código quando ele já está no arquivo?
E você poderia eliminar a variável for var in Alabama Alaska Arizona Arkansas …
e fazer
eval $state_name=$(sed -n '2p;2q' states | cut -d, -f$counter)
no loop, mas isso exigiria ler o arquivo values
50 vezes em vez de uma vez.
(Ou 51 vezes em vez de duas vezes,
se você contar a declaração states
.