GNU Parallel связывает аргументы с чередующимися аргументами

Вы, вероятно, сделали бы что-то вроде следующего, чтобы объединить их (непроверенными, поскольку у меня нет доступа к журналам в системе macOS High Sierra, а сообщения журнала вообще не совпадают в моей системе Mojave):

cat /private/var/log/system.log | awk '
    BEGIN { OFS="\t"; print "Month", "Day", "Time", "Message" }
    /SHUTDOWN_TIME/ { sub(":$","",$8); print $1, $2, $3, $8 }
    /BOOT_TIME/     {                  print $1, $2, $3, $6 }'

sub()удаляет завершающий :в 8-м поле, если он там есть.

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

В моей системе macOS Mojave другие файлы system.log*сжаты, что означает, что вы не можете использовать catдля отправки их содержимого в awk. Вы бы использовали zcatна них. Как пользователь-администратор в системе, мне также не нужно использовать sudoдля чтения журналов.

1
08.04.2020, 18:10
2 ответа

Для части ответа вы хотите этого, верно?

$ parallel --link -k echo {1} {2} ::: {0..3} ::: {100..450..50}
0 100
1 150
2 200
3 250
0 300
1 350
2 400
3 450

Если это так, один из способов сделать то, что, как я думаю, вы хотите, это

$ parallel -k echo {1} {2} ::: {10..20..10} ::: "$(parallel --link -k echo {1} {2} ::: {0..3} ::: {100..450..50})"
10 0 100
10 1 150
10 2 200
10 3 250
10 0 300
10 1 350
10 2 400
10 3 450
20 0 100
20 1 150
20 2 200
20 3 250
20 0 300
20 1 350
20 2 400
20 3 450

Другим способом было бы (добавить сортировку, чтобы отобразить ее в нужном вам порядке; на самом деле в этом нет необходимости):

$ parallel --link -k echo {1} {2} ::: {0..3} ::: {100..450..50} | parallel -a- echo {2} {1} ::: {10..20..10} | sort -k 1,1 -k3,3 -k2,2
10 0 100
10 1 150
10 2 200
10 3 250
10 0 300
10 1 350
10 2 400
10 3 450
20 0 100
20 1 150
20 2 200
20 3 250
20 0 300
20 1 350
20 2 400
20 3 450

Еще один способ — использовать параллельный вызов параллельного:

$ parallel parallel --link --arg-sep,,, echo {1},,, {0..3},,, {100..450..50} ::: {10..20..10}
10 0 100
10 1 150
10 2 200
10 3 250
10 0 300
10 1 350
10 2 400
10 3 450
20 0 100
20 1 150
20 2 200
20 3 250
20 0 300
20 1 350
20 2 400
20 3 450

Это работает, потому что «внутренняя» параллель использует запятые вместо двоеточий для разделителей аргументов, поэтому «внешняя» параллель не «видит» связанный аргумент.

Пока я работал над тем, чтобы сделать это более понятным (там есть предполагаемый '{}' )Я понял, что этот последний пример точно не сработает для вас, потому что 2-й и 3-й аргументы являются одной строкой. Итак, я добавил уточнение и (еще одно! )parallel, чтобы продемонстрировать, как вы будете запускать симулятор Python.

$ parallel parallel --link --arg-sep,,, -I [] echo {1} [],,, {0..3},,, {100..450..50} ::: {10..20..10} | parallel -C' ' echo foo {1} bar {2} blat {3}
foo 10 bar 0 blat 100
foo 10 bar 1 blat 150
foo 10 bar 2 blat 200
foo 10 bar 3 blat 250
foo 10 bar 1 blat 350
foo 10 bar 0 blat 300
foo 10 bar 2 blat 400
foo 10 bar 3 blat 450
foo 20 bar 0 blat 100
foo 20 bar 1 blat 150
foo 20 bar 2 blat 200
foo 20 bar 3 blat 250
foo 20 bar 0 blat 300
foo 20 bar 1 blat 350
foo 20 bar 2 blat 400
foo 20 bar 3 blat 450

Для любого пронумерованного списка значений

$ parallel parallel --link --arg-sep,,, -I [] echo {1} [],,, {0..3},,, v0.0 v0.1 v0.2 v0.3 v1.0 v1.1 v1.2 v1.3 ::: {10..20..10} | parallel -C' ' echo power {1} seed {2} num {3}
power 20 seed 0 num v0.0
power 20 seed 1 num v0.1
power 20 seed 2 num v0.2
power 20 seed 3 num v0.3
power 20 seed 0 num v1.0
power 20 seed 1 num v1.1
power 20 seed 2 num v1.2
power 20 seed 3 num v1.3
power 10 seed 0 num v0.0
power 10 seed 1 num v0.1
power 10 seed 2 num v0.2
power 10 seed 3 num v0.3
power 10 seed 0 num v1.0
power 10 seed 1 num v1.1
power 10 seed 2 num v1.2
power 10 seed 3 num v1.3

Это будет очень длинный ответ. Я думаю, может быть, вы хотите что-то более похожее на это, где от 1 до 12 (число степеней, умноженное на число начальных чисел ), являются уникальными значениями для каждой комбинации мощности и начального числа и могут быть пронумерованным списком значений, а не { 1..12}? Обратите внимание, что я связываю мощность и семя, а не число и семя.

$ parallel --link echo {1} {2} ::: "$(parallel echo {1} {2} ::: {10..30..10} ::: {0..3})" ::: {1..12} | parallel -C' ' echo run-sim --power {1} --seed {2} --num {3}
run-sim --power 10 --seed 0 --num 1
run-sim --power 10 --seed 1 --num 2
run-sim --power 10 --seed 2 --num 3
run-sim --power 10 --seed 3 --num 4
run-sim --power 20 --seed 0 --num 5
run-sim --power 20 --seed 1 --num 6
run-sim --power 20 --seed 2 --num 7
run-sim --power 20 --seed 3 --num 8
run-sim --power 30 --seed 0 --num 9
run-sim --power 30 --seed 1 --num 10
run-sim --power 30 --seed 2 --num 11
run-sim --power 30 --seed 3 --num 12
1
28.04.2021, 23:18

Непонятно, как вы определяете num. Вы можете использовать массив на основе мощности и начального числа :

.
$ declare -A num=([10,0]=100 [10,1]=150 [10,2]=200 [10,3]=250 [20,0]=300 [20,1]=350 [20,2]=400 [20,3]=450 [30,0]=133 [30,1]=166 [30,2]=200 [30,3]=233)
$ env_parallel -j 50 echo power {1} seed {2} num '${num[{1},{2}]}' ::: 10 20 30 ::: 0 1 2 3

Или массив на основе порядкового номера:

$ num=(dummy 100 150 200 250 300 350 400 450 133 166 200 233)
$ env_parallel -j 50 echo power {1} seed {2} num '${num[{#}]}' ::: 10 20 30 ::: 0 1 2 3

А может быть:

parallel -j 50 echo power {1} seed '{=1 $_=(seq()-1)%4=}' num {2} ::: 10 10 10 10 20 20 20 20 30 30 30 30 :::+ 100 150 200 250 300 350 400 450 133 166 200 233
2
28.04.2021, 23:18

Теги

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