Quando executo o seguinte one-liner, obtenho uma saída run-on no PuTTY da seguinte forma:
( \
adicionado abaixo para facilitar a leitura, que não está incluído no script one-liner real)
fileName=10M.csv ; \
for k in {1..3}; do for i in {1..1}; do for j in {blue,red,yellow}; do \
working=`cat "$fileName" | \
awk -v i=$i -v j=$j -v k=$k -F',' '{ if ( $1 == j && $2 == i && $3 == k ) print $1","$2","$3","$4","$13","$14}'`; \
nJ=${j:0:1}; \
nJ=${nJ^^}; \
echo "$i $j $nJ $k"; \
new="$i""_""$nJ""_""$k""_.txt"; \
echo $new; \
echo $working; \
done; done; done
No entanto, obtenho uma boa saída se simplificar o script removendo a working=
parte da linha 3 [sem contar as linhas em branco] e os "tiques" correspondentes, de modo que sejam cat
executados conforme o esperado; não é até que seja encerrado na working
variável que a tabela CSV se torna executada quando echo
-ed:
fileName=10M.csv ; \
for k in {1..3}; do for i in {1..1}; do for j in {blue,red,yellow}; do \
cat "$fileName" | \
awk -v i=$i -v j=$j -v k=$k -F',' '{ if ( $1 == j && $2 == i && $3 == k ) print $1","$2","$3","$4","$13","$14}'; \
nJ=${j:0:1}; \
nJ=${nJ^^}; \
echo "$i $j $nJ $k"; \
new="$i""_""$nJ""_""$k""_.txt"; \
echo $new; \
done; done; done
O que há de errado com meu script para produzir a saída run-on no PuTTY?
- Suponho que tenha a ver com
awk
, mas sou minimamente qualificado em AWK e tentei enviar por correio aawk
sintaxe adequada ao trabalhar com arquivos CSV.
Você esqueceu de colocar aspas duplas
$working
quando está expandido (ou seja, em seuecho
comando), portanto, está sujeito a divisão de palavras; em vez de todo o valor ser um único argumento para 'echo', cada palavra separada por espaços em branco se torna um argumento separado, com os separadores originais sendo perdidos, poisecho
sempre une os argumentos recebidos usando um único espaço:`cmd`
, bem como a$(cmd)
todas as outras expansões, mas seu uso de backtick é isento porque faz parte de uma atribuição de variável - ou seja, o caso específico devar=`cmd`
pode tecnicamente ser deixado sem aspas, mas mudando paravar="`cmd`"
, ou mesmovar="$(cmd)"
, não faria mal e poderia melhorar a compreensão.