Преобразуйте json, отображающий объект на управляемую csv строку с помощью сценария удара

Если вы имеете в виду, что хотите иметь возможность запускать два экземпляра mc от одного и того же пользователя одновременно с разными каталогами конфигурации, насколько я могу судить, вы не можете. Путь жестко закодирован.

Однако, если вы имеете в виду, что хотите иметь возможность переключать, какой из каталогов config используется, то вот вам идея (проверено, работает). Вы, вероятно, хотите сделать это без запуска mc:

  • Создать каталог $HOME/mc_conf, с поддиректорией, one.
  • Переместите содержимое $HOME/.config/mc в $HOME/mc_conf/один подкаталог
  • Дублируйте один каталог в виде $HOME/mc_conf/two.
  • Создайте скрипт, $HOME/bin/switch_mc:

    #!/bin/bash
    
    configBase=$HOME/mc_conf
    linkPath=$HOME/.config/mc
    
    если [ -z $1 ] || [ ! -e "$configBase/$1" ]; тогда
     эхо "Требуется достоверное имя субдиректории".
     выход 1
    
    
    убойный макияж
    объём оборотов $linkPath
    ln -sv $configBase/$1 $linkPath 
    
  • Запустите это, switch_mc one . rm не будет лаять о таком файле, это не имеет значения.

Надеюсь, там всё ясно - это устанавливает путь к каталогу config как симлинк. Что бы вы сейчас ни изменили и сохранили конфигурацию, это будет в каталоге one. Затем вы можете выйти и switch_mc two, вернуться к старой конфигурации, затем снова запустить mc, внести изменения и сохранить их, и т.д.

Вам может сойти с рук удаление killall mc и проигрывание; конфигурационный материал находится в файле ini, который считывается при запуске (таким образом, вы не можете включить его "на лету"). Затем он не трогается до выхода, если вы не "Save setup", но при выходе может быть перезаписан, так что опасность здесь заключается в том, что вы удалите что-то, что вы сделали ранее или за пределами запущенного экземпляра.

0
04.07.2014, 08:54
2 ответа

Разбор таких структурированных данных лучше всего проводить с помощью специального парсера, так же, как и вы это делаете. Однако, в данном конкретном случае достаточно просто сделать:

$ grep -B 1 '"type":' Customer.json | tr $'"' $"'" | sed 's/[:,]//g' | 
    awk '{print "field(key: "$1",\tdisplayName: "$1",\t type: "$NF")"}' RS="--" 

Который возвращает:

field(key: 'customerId',    displayName: 'customerId',   type: 'string')
field(key: 'name',  displayName: 'name',     type: 'string')
1
28.01.2020, 02:37

Предполагая, что у вас достаточно памяти для приостановки файла, вы можете попробовать

perl -e 'use List::Util 'shuffle'; @k=shuffle(<>); print @k[0..999]' file.bed

Поскольку вы хотите сделать это 10000 раз, я бы рекомендовал интегрировать повторение в сценарий и перетасовать индексы , а не сам массив для ускорения:

$ time perl -e 'use List::Util 'shuffle'; 
            @l=<>; for $i (1..10000){
               open(my $fh, ">","file.$i.bed"); 
               @r=shuffle(0..$#l); 
               print $fh @l[@r[0..999]]
            }' file.bed

real    1m12.444s
user    1m8.536s
sys     0m3.244s

Выше создано 10000 файлов по 1000 строк каждый из файла, который содержал 37000 строк (пример файла повторяется 1000 раз). Как видите, на мою систему ушло чуть больше трех минут.

Объяснение

  • используйте List:: Util 'shuffle'; : импортирует модуль Perl, предоставляющий функцию shuffle () , которая рандомизирует массив.
  • @ l = < >; : загрузите входной файл ( < > ) в массив @ l .
  • для $ i (1.. 10000) {} : запустите этот 10000 раз.
  • @ r = shuffle (0.. $ # l); : $ # l - количество элементов в @ l , поэтому @ r теперь является рандомизированным списком индексных номеров массива @ l (строки входного файла).
  • открыть (мои $ fh, «>», «файл. $ i.bed»); : открыть файл с именем файл. $ i.bed для записи. $ i будет принимать значения от 1 до 10000.
  • print $ fh @ l [@ r [0.. 999]]] : возьмите первые индексы 1000 в перетасованном массиве и напечатайте соответствующие строки (элементы @ l ).

Другой подход заключается в использовании shuf ( thanks @ frostschutz ):

$ time for i in {1..10000}; do shuf -n 1000 file.bed > file.$i.abed; done

real    1m9.743s
user    0m23.732s
sys     0m31.764s
-121--36529-

Есть много способов сделать это, конечно, но почему вы хотите? Это то, что файл fstab является для .

Некоторые идеи:

  • Создайте системное монтирование или автомонтирование (или просто простой сценарий запуска, выполняющий монтирование ).
  • Для запуска монтирования используйте crontab.
  • Наличие сценария запуска в среде рабочего стола.
  • Найдите инструмент в официальных репо или AUR, который сделает это для вас (у меня нет рекомендации).
  • Вставьте злой взлом, где бы вы ни выбрали.
-121--114493-

Мне кажется, что ошибка ясна: переменная «i» является последовательностью, поскольку цикл для итерирует значение « клиента» dict/mapping. Это значение само по себе является dict/mapping и итерация над ним даст вам последовательность списка ключей (т.е. [«свойства»].

cat Customer.json |  python -c 'import sys; import simplejson as json; \
print "\n".join( [i for i in json.loads( sys.stdin.read() )["customer"]["properties"] ] )'

даст вам

 customerid
 name

и следующее должно приблизить вас к вашей цели:

cat Customer.json |  python -c 'import sys; import simplejson as json; \
print "\n".join( ["{} {}".format(k, v) for k,v in json.loads( sys.stdin.read() )["customer"]["properties"].iteritems() ] )'

что дает:

customerId {'index': 'not_analyzed', 'type': 'string'}
name {'index': 'not_analyzed', 'type': 'string'}

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

1
28.01.2020, 02:37

Теги

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