Как делают меня управляющий символ escape в сценарии оболочки?

Я хочу записать текст в другой файл с помощью сценария оболочки echo но данные не пишутся в точном формате как я намерение

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

но я получаю текст как это в 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,,,,,,,,,,,,,,

я попытался выйти из специального символа, но все еще данные не находятся в точном формате.

кто-либо может помочь мне сделать это?

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
1
задан 26 May 2017 в 13:09

3 ответа

Чтобы помешать оболочке касаться Вашего текста (включая специальные символы как $ и > или *, поместите все в одинарные кавычки. Для включения одинарных кавычек в строку, необходимо прервать заключенную в кавычки строку и добавить оставленную из обратной косой черты одинарную кавычку, приводящую к '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
1
ответ дан 7 December 2019 в 15:35

Легче, если Вы разделяете печать и использовали printf строки формата для расположения вывода. Во-первых, команда вставки, используя в своих интересах расширение фигурной скобки:

printf "%s " paste B{01..12}_reprojected_subset_comma_updated.csv >> jobstext.sh

Затем команда awk, упрощенная при помощи 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

можно также использовать %q для упрощения строк формата, используемых для printf.

0
ответ дан 7 December 2019 в 15:35

Без образца Ваших файлов или четкого описания того, что Вы хотите сделать или нужный формат выходного файла, это - простые догадки. Возможно, Вы хотите добавить командную строку (вставьте stuff|awk действие) в файл jobstext.sh. Это было бы лучше сделано при помощи редактора для предотвращения вложенных проблем кавычки...

, Но Ваш вопрос спрашивает о выходе из специальных символов так, чтобы ответить, что одна опция состоит в том, чтобы инкапсулировать одинарную кавычку в двойных кавычках. Сокращая Ваши долгие имена файлов вниз до B01, и т.д., это посмотрело бы как ниже.

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

первая одинарная кавычка запускает строку, которая включает команду вставки, имена файлов, канал, awk и опцию F. Затем первая одинарная кавычка '"'"' последовательность закрывает строку, следующие 3 символа определяют другую строку одинарной кавычки, и последний символ является одинарной кавычкой, начинающей третью строку (который включает awk действие в фигурные скобки). Подобные 5 последовательностей кавычки закрывают ту строку, вставляют другую одинарную кавычку и запускают пятую строку (который состоит из перенаправления вывода в allbands.csv). Наконец та строка закрывается (с последней кавычкой строки), таким образом, все 5 строк связываются и добавляются к jobstext.sh.

Это является громоздким, но это - то, что вышло из попытки использовать два уровня единственного заключения в кавычки на одной командной строке. Одинарные кавычки требуются, чтобы препятствовать тому, чтобы awk оператор был интерпретирован оболочкой.

Улучшения были бы 1/для использования имен файлов, которые могли быть расширены с * (но "B8A" представляет несоответствие, которое предотвращает простое расширение имени файла), и 2/для упрощения команды путем редактирования его в jobstext.sh. Предложения в ответе @muru стоит включить (но заботьтесь с этим файл "B8A"!)

0
ответ дан 7 December 2019 в 15:35

Другие вопросы по тегам:

Похожие вопросы: