Как избежать символа в сценарии оболочки?

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

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

6 ответов

Без образца ваших файлов или четкого описания того, что вы хотите сделать, или желаемого формата выходного файла, это просто догадки. Возможно, вы хотите добавить командную строку (вставить материал | awk action) в файл 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

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

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

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

0
ответ дан 18 July 2018 в 12:42

Это проще, если вы разделили печать и использовали строки формата printf для организации вывода. Во-первых, команда paste, использующая расширение скобки:

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
ответ дан 18 July 2018 в 12:42

Чтобы оболочка не касалась вашего текста (включая специальные символы, такие как $ и > или *, поместите все в одинарные кавычки). Чтобы включить одинарные кавычки в строку, вам нужно прервать цитированную строку и добавить обратная косая черта с одиночной цитатой, приводящая к '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
ответ дан 18 July 2018 в 12:42

Без образца ваших файлов или четкого описания того, что вы хотите сделать, или желаемого формата выходного файла, это просто догадки. Возможно, вы хотите добавить командную строку (вставить материал | awk action) в файл 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

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

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

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

0
ответ дан 24 July 2018 в 20:01

Это проще, если вы разделили печать и использовали строки формата printf для организации вывода. Во-первых, команда paste, использующая расширение скобки:

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
ответ дан 24 July 2018 в 20:01

Чтобы оболочка не касалась вашего текста (включая специальные символы, такие как $ и > или *, поместите все в одинарные кавычки). Чтобы включить одинарные кавычки в строку, вам нужно прервать цитированную строку и добавить обратная косая черта с одиночной цитатой, приводящая к '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
ответ дан 24 July 2018 в 20:01
  • 1
    Вы не можете избежать ' в строке с одним кавычком – muru 26 May 2017 в 13:55
  • 2
    @muru спасибо. Я почему-то верил, что всегда делал это так, но явно не в раковине. Узнал что-то и исправил его. Благодарю. – Philippos 26 May 2017 в 14:33

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

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