Я хочу записать текст в другой файл с помощью скрипта оболочки 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
Чтобы оболочка не касалась вашего текста (включая специальные символы, такие как $
и >
или ) *
, заключите все в одинарные кавычки. Чтобы включить одинарные кавычки в строку, вам нужно прервать строку в кавычках и добавить одинарную кавычку, экранированную обратной косой чертой, в результате чего получится '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
решение2
Будет проще, если вы разделите печать и используете 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
.
решение3
Без образца ваших файлов или четкого описания того, что вы хотите сделать, или желаемого формата выходного файла это просто догадки. Возможно, вы хотите добавить командную строку (paste stuff|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
Первая одинарная кавычка начинает строку, которая включает команду вставки, имена файлов, канал, awk и опцию F. Затем первая одинарная кавычка последовательности '"'"'
закрывает строку, следующие 3 символа определяют другую строку одинарной кавычки, а последний символ — это одинарная кавычка, начинающая третью строку (включающую действие awk в фигурных скобках). Похожая последовательность из 5 кавычек закрывает эту строку, вставляет еще одну одинарную кавычку и начинает пятую строку (которая состоит из перенаправления вывода в allbands.csv). Наконец, эта строка закрывается (с последней кавычкой строки), поэтому все 5 строк объединяются и добавляются в jobstext.sh.
Это обременительно, но именно это и происходит, когда пытаешься использовать два уровня одинарных кавычек в одной командной строке. Одинарные кавычки необходимы для того, чтобы предотвратить интерпретацию оператора awk оболочкой.
Улучшения были бы следующими: 1) использовать имена файлов, которые можно было бы расширить *
(но ваш "B8A" вносит несоответствие, которое препятствует простому расширению имени файла), и 2) упростить команду, отредактировав ее в jobstext.sh. Предложения в ответе @muru стоит включить (но будьте осторожны с этим файлом "B8A"!)