Разделить файл и поместить его в соответствующую структуру данных?

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

10
17.12.2013, 06:06
4 ответа

структуры данных удара являются слишком элементарными даже для 2-мерных массивов. Вы уверены, что это - инструмент, который Вы хотите использовать?

С ударом и GNU grep, можно сделать эту неприятную путаницу:

line='{machineA=[0, 1024, 4, 1028], machineB=[1, 1025, 5, 1029]}'
declare -A "$(
    echo "x=("
    grep -oP '(\w+)(?==)|(?<==\[).*?(?=\])' <<< "$line" |
      tr -d , |
      paste - - |
      sed 's/^/[/; s/\t/]="/; s/$/"/'
    echo ")"
)"

for key in "${!x[@]}"; do           # need quotes here
    for element in ${x[$key]}; do   # no quotes here
        printf "%s\t%s\n" "$key" "$element"
    done
done
machineA    0
machineA    1024
machineA    4
machineA    1028
machineB    1
machineB    1025
machineB    5
machineB    1029

Это довольно хрупко. Я использовал бы Perl для чего-то вроде этого: все еще ужасный, но более краткий

echo "$line" | perl -MData::Dumper -ne '
    s/=\[/=>[/g; 
    eval "\$x=$_";
    # do something with your data structure (a hash of arrays) 
    print Dumper($x)
'
$VAR1 = {
          'machineB' => [
                          1,
                          1025,
                          5,
                          1029
                        ],
          'machineA' => [
                          0,
                          1024,
                          4,
                          1028
                        ]
        };
4
27.01.2020, 20:03
  • 1
    Спасибо за предложение. Я мог бы пойти с опцией сценария оболочки как наконец, я должен использовать scp, таким образом, я полагаю, что выполнение scp в сценарии оболочки будет легко. Но так или иначе, позвольте, видят, как это выходит. Я обновил свой вопрос с фактическим сценарием оболочки, который я мог бы использовать после слияния Вашего предложения. Смотрите и сообщите мне, выглядит ли это корректным и если бы существует что-либо, что требуется изменить затем сообщенный мне также. –  SSH 17.12.2013, 03:49
  • 2
    +1 Довольно гладкое перемещение с eval, там. –  Joseph R. 17.12.2013, 10:38

Утилиты обработки текста оболочки, прежде всего, разработаны для управления данными, представленными с одной записью на строку и полями, разделенными или пробелом или фиксированным символом. Этот формат полностью отличается, и Вы не сможете обработать его простым способом.

Один подход должен предварительно обработать файл для установки типу формата, который может быть обработан легко. Я предполагаю, что скобки и фигурные скобки не используются всегда кроме изображаемого здесь (фигурные скобки вокруг целого текста, скобки вокруг списков значения машины).

<data.txt sed -e 's/^{//' -e 's/}$//' -e 's/ *= *\[/,/g' -e 's/, */,/g' -e 's/\] *$//' -e 's/] *, */\n/g'

Результат имеет одну машину на строку и запятые для разделения записей. Следующий отрывок анализирует название машины на каждой строке и оставляет разделенный запятыми список внутри значений values.

… | while IFS=, read -r machine values; do …

Следующий определенный для удара отрывок помещает значения в массив.

… | while IFS=, read -r -a values; do
  machine=${values[0]}; shift values
  echo "There are ${#values[@]} on machine $machine"
done
1
27.01.2020, 20:03
  • 1
    @Giles: Спасибо за предложение. Также возможно получить общее количество файлов для каждого машины? значение общего количества с помощью того же выше команды? Как, поскольку выше примера, machineA имеет четыре файла и machineB, имеет также четыре файла –  SSH 17.12.2013, 10:50
  • 2
    @SSH Посмотрите мое редактирование. –  Gilles 'SO- stop being evil' 17.12.2013, 15:56

Можно использовать awk выполнять задачу.

awk -F "], " '/[a-zA-Z]=\[[0-9]/ {gsub(/{|}/,""); for(i=1; i<=NF; i++) if($i !~ /\]$/) print $i"]"; else print $i}' data.txt

machineA=[0, 1024, 4, 1028]
machineB=[1, 1025, 5, 1029]
0
27.01.2020, 20:03
  • 1
    Спасибо John. Действительно ли возможно получить общее количество файлов также для каждой машины. Как, поскольку выше примера, machineA имеет четыре файла и machineB, имеет также четыре файла. Действительно ли возможно получить это также? –  SSH 17.12.2013, 10:32

Это смотрит немного как JSON. Можно зафиксировать его, чтобы быть надлежащим JSON и инструментами JSON использования:

$ echo '{machineA=[0, 1024, 4, 1028], machineB=[1, 1025, 5, 1029]}' |  perl -pe 's!\b!"!g; s/=/:/g' | json_pp
{
   "machineB" : [
      "1",
      "1025",
      "5",
      "1029"
   ],
   "machineA" : [
      "0",
      "1024",
      "4",
      "1028"
   ]
}
0
27.01.2020, 20:03

Теги

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