Bash :Преобразование строк в элементы массива

rsyncOpts не является допустимой директивой.

Должно быть что-то вроде:-

rsync     = {
                links = true,
                archive  = true,
                delete = false,
                compress = true,
                verbose = true,
                _extra   = {"--omit-dir-times","-e ssh -i /root/lsync/source_rsa","--progress"}
            }
0
07.11.2020, 16:28
2 ответа

Подход awk:

$ awk -F'[ :]' 'BEGIN{printf "["}NR>1{printf "[%s,%s,%s],",$3,$4,$5}END{printf "]\n"}' file | sed 's/,\]$/]/'
[[118.851979,120.668604,84.472229],[126.789728,149.506520,103.196917],[126.379687,149.382354,104.504792],[126.989312,149.372811,103.499396],[126.330563,149.373374,103.956438],[127.238791,149.458749,103.198541],[125.263833,132.658750,88.320687],[126.828000,148.570000,98.722229],[125.042667,147.087896,98.871813],[124.392521,148.656792,103.744938],[115.969084,131.787022,91.721250],[125.385521,135.633751,91.044167],[125.046354,149.432500,104.132167],[126.368354,149.454480,103.942208],[126.454229,149.583730,104.462458],[114.102083,134.422916,93.555625],[127.905604,138.012417,85.556396],[126.362271,149.187688,104.087229],[115.580250,133.450563,93.011062],[125.555854,133.653730,88.441501]]

Или, чуть более разборчиво:

awk -F'[ :]' 'BEGIN{
                printf "["
              }
              NR>1{
                printf "[%s,%s,%s],",$3,$4,$5
              }
              END{
                printf "]\n"
              }' file | sed 's/,\]$/]/'

Пояснение

  • awk -F'[ :]':установить разделитель полей ввода awk на пробел ИЛИ a :.
  • BEGIN{printf "["}:напечатать открытие [.
  • NR>1{printf "[%s,%s,%s],",$3,$4,$5}:для каждой строки, кроме первой, выведите 3-е, 4-е и 5-е поля внутри [ ]и разделите их запятой.
  • END{printf "]\n"}:напечатать закрытие ].
  • sed 's/,\]$/]/':удалить последний ,, добавленный перед блоком END.
2
18.03.2021, 22:51

Итак... оба этих ответа хороши, но они меня сильно нервируют. Позволь мне объяснить.

awkнастолько же «Unix», насколько это возможно. Однако неразумно предполагать, что какой "awk" вы получите; все они являются очень мощными, но очень несовместимыми расширениями либо оригинального awk (, который вы скорее всего получите, но только на Mac ), либо одного из gawk, mawk, нук аук... или, гм, перл. Назвать несколько.

AWK сам по себе также является полностью полным по Тьюрингу -языком, но он напоминает командный язык оболочки (, т. е. то, что вы называете "bash" )слишком много для того, чтобы мне нравилось вызывать inline для чего-то вроде это. Одна неуместная одинарная кавычка, и внезапно ваши команды AWK выполняются в оболочке, но делают что-то совершенно другое. Это также немного тяжело для того, что было бы относительно простой задачей, подобной этой... AWK может сам по себе создавать вложенные ассоциативные массивы и имеет собственные тригонометрические функции, которые он может выполнять на родных 32 -бит. числа с плавающей запятой. Питон не нужен.

Решение jqявляется потрясающим ... Я чувствую себя довольно глупо — я совершенно не осознавал, что jqимеет возможность читать в свой родной JSON как будто он может считывать из ... но, конечно же, может! Я не уверен, чтоjqне может сделать ... Я недавно использовал оболочку, я забыл, как она называлась, которая могла легко и безопасно обрабатывать XML Xpath с той же нотацией и затем верните те же данные с обратным значением ключа -, но в YAML. Удивительно. Однако jq— это инструмент, основанный на JSON — (формате сериализации данных, изобретенном Дугласом Крокфордом ), и он также не звучит точно как то, что вы ищете, как :1. Хотя они выглядят одинаково, структуры данных Python не JSON, и если вы хотите безопасно обрабатывать JSON в Python,вам нужно использовать модуль json, чтобы обеспечить правильную обработку десериализации. и т. д. И в подобных вложенных скобках JSON [[],]имеет совершенно другое значение, чем в Python :это способ явно сказать в JavaScript Object Notation, что «это конкретно массив с вложенным массивом (s ), а не объектами , которые используют фигурные скобки, {}, а не квадратные скобки, []. Он также не будет, например, обрабатывать висячая запятая после последнего вложенного массива, в то время как Python обычно делает это

.

Если бы этот вопрос был просто о обработке текста , как он помечен, я бы указал, что почти все современные оболочки могут выполнять этот тип обработки текста без вызова одной внешней программы — вы можете передать файл встроенной программе read, которая принимает одну переменную в качестве аргумента, (обычно используемого в цикле while, и переменная традиционно называется line, то есть while read line < file; do), а затем в вашем блоке do вы можете разделить каждую строку полем, передав ее в качестве аргумента функции, которая будет обрабатывать ее как специальные переменные $@и ее компоненты $1, $2, $3... и т. д. И если вы не хотите разбивать поля, вы можете использовать $*. Обычно это (), на самом деле единственный сложный тип данных, который есть в оболочке; иначе он ничего не знает и не обрабатывает как числа, за исключением (рудиментарного )арифметического расширения, которое выглядит как $(($x + 4)), или вызова внешнего инструмента или расширения.

Но не похоже, что это то, о чем вы спрашиваете, и я думаю, что лучший «ответ» выше, это от @thanasisp, который я собираюсь перефразировать как «если это будет использоваться в Python, почему вы не используете только Python?» или что, черт возьми, вы подразумеваете под «форматом массива, подобным питону -»?

Во-первых, фраза «python -как формат массива» более или менее бессмысленна.В то время как вложенные скобки --с форматом запятых -можно условно назвать C -, например(C — это язык, из которого это произошло, и почему он существует в Python, и JSON, и многие другие языки ), каждый язык (или формат сериализации )имеет много тонких, но очень важных различий в реализации. Более того, нет другого языка или языковой функции, которую я бы справедливо назвал «подобной Python -», за исключением Python. Python также является единственным языком, который, я бы сказал, справедливо также называется в отличие от Python, потому что Python полностью несовместим с Python, в зависимости от того, имеете ли вы в виду то, что сегодня называется «Python 2», который в значительной степени был запрещен. /принудительно устарел, или текущий «Python», изначально являвшийся форком, который по-разному был известен как Python 3000, Py3k, Python3, но (после многих лет ожесточенных дебатов, обычно подразумевается под «Python».

Наиболее важно то, что во всех версиях Python вы указали совершенно корректные данные, такие как «1 :118.851979», вполне допустимую конструкцию... но такую, которая, как мне кажется, не делает того, что вы хотите; двоеточие - это оператор "среза". Однако в Python обычно вполне допустимо неявно встраивать операцию, например, при назначении структурированной переменной, и также обычно можно встраивать код в другом месте. Однако на других языках это можно интерпретировать как число, являющееся отношением; в некоторых (C++ и т. д. )двоеточие указывает на селекторы объектов или шаблонов, а в оболочке это нулевая функция. Более того, приведенный вами пример также вполне корректен, но опять же, я полагаю, что он означает нечто совершенно иное, чем то, что вы на самом деле имеете в виду — [[a, b, c],[a, b, c],[a, b, c]...представляет собой конструкцию, состоящую из ссылок на три ранее определенные переменные, с именами «a», «b» или «c», за которыми следуют еще две ссылки на эти же переменные подряд. Ты это имеешь в виду?

Примеры у вас есть Я знаю, что это может показаться, но они действительно

2
18.03.2021, 22:51

Теги

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