Quero escrever texto em outro arquivo usando shell script, echo
mas os dados não estão sendo gravados no formato exato como pretendo
echo paste B01_reprojected_subset_comma_updated.csv B02_reprojected_subset_comma_updated.csv B03_reprojected_subset_comma_updated.csv B04_reprojected_subset_comma_updated.csv B05_reprojected_subset_comma_updated.csv B06_reprojected_subset_comma_updated.csv B07_reprojected_subset_comma_updated.csv B08_reprojected_subset_comma_updated.csv B8A_reprojected_subset_comma_updated.csv B09_reprojected_subset_comma_updated.csv B10_reprojected_subset_comma_updated.csv B11_reprojected_subset_comma_updated.csv B12_reprojected_subset_comma_updated.csv |awk -F",||\t" '{print $1","$2","$3","$6","$9","$12","$15","$18","$21","$24","$27","$30","$33","$36","$39}'>allbands.csv >> jobstext.sh
mas estou recebendo um texto como este em jobstext.sh
paste B01_reprojected_subset_comma_updated.csv B02_reprojected_subset_comma_updated.csv B03_reprojected_subset_comma_updated.csv B04_reprojected_subset_comma_updated.csv B05_reprojected_subset_comma_updated.csv B06_reprojected_subset_comma_updated.csv B07_reprojected_subset_comma_updated.csv B08_reprojected_subset_comma_updated.csv B8A_reprojected_subset_comma_updated.csv B09_reprojected_subset_comma_updated.csv B10_reprojected_subset_comma_updated.csv B11_reprojected_subset_comma_updated.csv B12_reprojected_subset_comma_updated.csv,,,,,,,,,,,,,,
tentei escapar do símbolo especial, mas os dados ainda não estão no formato exato.
alguém pode me ajudar a fazer isso?
paste B01_reprojected_subset_comma_updated.csv B02_reprojected_subset_comma_updated.csv B03_reprojected_subset_comma_updated.csv B04_reprojected_subset_comma_updated.csv B05_reprojected_subset_comma_updated.csv B06_reprojected_subset_comma_updated.csv B07_reprojected_subset_comma_updated.csv B08_reprojected_subset_comma_updated.csv B8A_reprojected_subset_comma_updated.csv B09_reprojected_subset_comma_updated.csv B10_reprojected_subset_comma_updated.csv B11_reprojected_subset_comma_updated.csv B12_reprojected_subset_comma_updated.csv |awk -F",||\t" '{print $1","$2","$3","$6","$9","$12","$15","$18","$21","$24","$27","$30","$33","$36","$39}'>allbands1.csv
Responder1
Para evitar que o shell toque em seu texto (incluindo caracteres especiais como $
e >
ou *
, coloque tudo entre aspas simples. Para incluir aspas simples na string, você deve interromper a string citada e adicionar uma aspa simples com escape de barra invertida, resultando em 'here comes the embedded '\''quote'
:
echo 'paste B01_reprojected_subset_comma_updated.csv B02_reprojected_subset_comma_updated.csv B03_reprojected_subset_comma_updated.csv B04_reprojected_subset_comma_updated.csv B05_reprojected_subset_comma_updated.csv B06_reprojected_subset_comma_updated.csv B07_reprojected_subset_comma_updated.csv B08_reprojected_subset_comma_updated.csv B8A_reprojected_subset_comma_updated.csv B09_reprojected_subset_comma_updated.csv B10_reprojected_subset_comma_updated.csv B11_reprojected_subset_comma_updated.csv B12_reprojected_subset_comma_updated.csv |awk -F",||\t" '\''{print $1","$2","$3","$6","$9","$12","$15","$18","$21","$24","$27","$30","$33","$36","$39}'\''>allbands.csv' >> jobstext.sh
Responder2
É mais fácil se você dividir a impressão e usar printf
strings de formato para organizar a saída. Primeiro, o comando colar, aproveitando a expansão das chaves:
printf "%s " paste B{01..12}_reprojected_subset_comma_updated.csv >> jobstext.sh
Então, o comando awk, simplificado usando OFS:
printf "| %s '%s' %s %s '%s' > %s\n" awk -F',|\t' -v OFS=, '{print $1, $2, $3, $6, $9, $12, $15, $18, $21, $24, $27, $30, $33, $36, $39}' allbands1.csv >> jobstext.sh
Você também pode usar %q
para simplificar as strings de formato usadas para printf
.
Responder3
Sem uma amostra dos seus arquivos ou uma descrição clara do que você deseja fazer ou do formato desejado do arquivo de saída, isso é mera suposição. Talvez você queira anexar uma linha de comando (paste stuff|awk action) ao arquivo jobstext.sh. Isso seria melhor feito usando um editor para evitar problemas de cotação aninhada...
Mas sua pergunta é sobre o escape de caracteres especiais, então, para responder que uma opção é encapsular uma aspa simples entre aspas duplas. Abreviando seus nomes de arquivos longos para B01, etc, ficaria como abaixo.
echo 'paste B01 B02 B03 B04 B05 B06 B07 B08 B8A B09 B10 B11 B12 |
awk -F",||\t" '"'"'{print "$1","$2","$3","$6","$9","$12","$15","$18","$21",
"$24","$27","$30","$33","$36","$39}'"'"' >allbands.csv' >> jobstext.sh
A primeira aspa simples inicia uma string que inclui o comando colar, nomes de arquivos, pipe, awk e opção F. Em seguida, a primeira aspa simples da '"'"'
sequência fecha a string, os próximos 3 caracteres definem outra string de aspas simples e o caractere final é uma aspa simples iniciando uma terceira string (que inclui a ação awk entre colchetes). Uma sequência semelhante de 5 aspas fecha essa string, insere outra aspa simples e inicia a quinta string (que consiste em redirecionar a saída para allbands.csv). Finalmente essa string é fechada (com a última aspa da linha), então todas as 5 strings são concatenadas e anexadas a jobstext.sh.
Isso é complicado, mas é o que acontece ao tentar usar dois níveis de aspas simples em uma linha de comando. As aspas simples são necessárias para evitar que a instrução awk seja interpretada pelo shell.
As melhorias seriam 1/ para usar nomes de arquivos que poderiam ser expandidos *
(mas seu "B8A" introduz uma inconsistência que impede a expansão simples de nomes de arquivos) e 2/ para simplificar o comando editando-o em jobstext.sh. Vale a pena incorporar as sugestões na resposta de @muru (mas tome cuidado com o arquivo "B8A"!)