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