Объединение строковых аргументов из входного файла и командной строки с помощью GNU parallel

#gnu-parallel

Вопрос:

Я пытаюсь передать как командную строку, так и отдельные аргументы из входного файла в GNU parallel. Мой сценарий выглядит так:

 parallel="parallel --delay 0.2 -j 100 --joblog remaining_runs_$1.log --resume "
$srun $parallel {python3 scaling.py {1} {2} {3}} <  missing_runs_$1.txt
 

Скрипт python принимает в качестве аргументов 3 отдельных целых числа, каждое из которых указано в missing_runs_$1.txt вот так:

 1 1 153
1 1 154
1 1 155
1 1 156
1 1 157
1 1 158
...
 

Я пробовал использовать --colsep , но это приводит к тому, что параллельно передаются только аргументы файла, в которых отсутствует python3 scaling.py часть. Без --colsep каждой строки файла интерпретируется как строка, которая также не является тем, что я хочу (например, python3 scaling.py '1 1 153' ). Есть какие-нибудь идеи?

Комментарии:

1. Это не обсуждение программирования, но вы могли бы попробовать этот синтаксис: parallel --delay 0.2 -j 100 --joblog remaining_runs_$1.log --resume python3 scaling.py {1} {2} {3} :::: < missing_runs_$1.txt

2. Что ты получаешь от --dryrun этого ?

3. @RonaldoFerreiradeLima @Ole удаление —colsep и апострофов, т. Е. запуск parallel --delay 0.2 -j 100 --joblog curtailment_scaling_remaining_$1.log --resume python3 scaling.py {1} {2} {3} :::: < missing_runs_$1.txt этого, я получаю: python3 curtailment_scaling.py '1 1 163' я пробовал разные комбинации, это либо разделит входные данные и пропустит другую часть команды, либо сохранит входные данные в виде строки.

4. @антония-извини, я недооценила твою проблему.

Ответ №1:

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

Простой скрипт на python:

 #!/usr/bin/python

import sys

for i in range(1, len(sys.argv)):
    print(f'The argument number {i} is {sys.argv[i]}.')
 

И упрощенная командная строка:

 parallel --dry-run -j 100 --colsep ' ' ./python.py {1} {2} {3} :::: < missing_runs_1.txt

./python.py 1 1 153
./python.py 1 1 154
./python.py 1 1 155
./python.py 1 1 156
./python.py 1 1 157
./python.py 1 1 158
 

без --dry-run :

 The argument number 1 is 1.
The argument number 2 is 1.
The argument number 3 is 153.
The argument number 1 is 1.
The argument number 2 is 1.
The argument number 3 is 154.
The argument number 1 is 1.
The argument number 2 is 1.
The argument number 3 is 155.
The argument number 1 is 1.
The argument number 2 is 1.
The argument number 3 is 156.
The argument number 1 is 1.
The argument number 2 is 1.
The argument number 3 is 157.
The argument number 1 is 1.
The argument number 2 is 1.
The argument number 3 is 158.
 

Используя все аргументы из вашей параллельной команды, в файле remaining_runs_1.log я получил:

 Seq Host    Starttime   JobRuntime  Send    Receive Exitval Signal  Command
1   :   1630591288.009       0.021  0   86  0   0   ./python.py 1 1 153
2   :   1630591288.220       0.040  0   86  0   0   ./python.py 1 1 154
3   :   1630591288.422       0.035  0   86  0   0   ./python.py 1 1 155
4   :   1630591288.649       0.041  0   86  0   0   ./python.py 1 1 156
5   :   1630591288.859       0.042  0   86  0   0   ./python.py 1 1 157
6   :   1630591289.081       0.040  0   86  0   0   ./python.py 1 1 158
 

Я думаю, что это может решить проблему или, по крайней мере, дать новые идеи для окончательного решения.

Ответ №2:

Если

 parallel --delay 0.2 -j 100 --joblog curtailment_scaling_remaining_$1.log --resume python3 scaling.py {1} {2} {3} :::: < missing_runs_$1.txt
 

дает тебе:

 python3 curtailment_scaling.py '1 1 163'
 

и ты хочешь:

 python3 curtailment_scaling.py 1 1 163
 

вы можете это сделать (версия > 20190722):

 parallel --delay 0.2 -j 100 --joblog curtailment_scaling_remaining_$1.log --resume python3 scaling.py {=uq=} < missing_runs_$1.txt
 

( uq выполняется uq(); , что приводит к тому, что строка замены не будет заключена в кавычки.)

или:

 parallel --delay 0.2 -j 100 --joblog eval curtailment_scaling_remaining_$1.log --resume python3 scaling.py {} < missing_runs_$1.txt