У меня есть программа, которую я могу запустить двумя способами: в одностороннем или парном режиме. Вот синтаксис:
program <output-directory-name> <input1> [input2]
Где требуется выходной каталог и хотя бы один вход. Если бы я хотел запустить это для трех файлов, скажем, образцов A, B и C, я бы использовал что-то вроде find с xargs или parallel:
user@host:~/single$ ls
sampleA.txt sampleB.txt sampleC.txt
user@host:~/single$ find . -name "sample*" | xargs -i echo program {}-out {}
program ./sampleA.txt-out ./sampleA.txt
program ./sampleB.txt-out ./sampleB.txt
program ./sampleC.txt-out ./sampleC.txt
user@host:~/single$ find . -name "sample*" | parallel --dry-run program {}-out {}
program ./sampleA.txt-out ./sampleA.txt
program ./sampleB.txt-out ./sampleB.txt
program ./sampleC.txt-out ./sampleC.txt
Но когда я хочу запустить программу в «парном» режиме, мне нужно дать ей два входа. Это связанные файлы, но их нельзя просто объединить — вы должны запустить программу с обоими в качестве входных данных. Файлы имеют разумные имена, например, sampleA_1.txt и sampleA_2.txt.
Я хочу иметь возможность легко создать это в командной строке с чем-то вроде xargs (или предпочтительно параллельно):
user@host:~/paired$ ls
sampleA_1.txt sampleB_1.txt sampleC_1.txt
sampleA_2.txt sampleB_2.txt sampleC_2.txt
user@host:~/paired$ find . -name "sample*_1.txt" | sed/awk? | parallel ?
program ./sampleA-out ./sampleA_1.txt ./sampleA_2.txt
program ./sampleB-out ./sampleB_1.txt ./sampleB_2.txt
program ./sampleC-out ./sampleC_1.txt ./sampleC_2.txt
В идеале команда должна удалить _1.txt, чтобы создать имя выходного каталога (sampleA-out и т. д.), но мне действительно нужно иметь возможность взять этот аргумент и изменить _1 на _2 для второго ввода.
Я знаю, что это очень просто со скриптом - я сделал это на Perl с быстрой заменой регулярного выражения. Но я хотел бы иметь возможность сделать это с помощью быстрого однострочника.
Заранее спасибо.