У меня есть программа, которую я могу запустить двумя способами: односторонний или парный. Вот синтаксис:
program <output-directory-name> <input1> [input2]
Где требуется выходной каталог и хотя бы один вход. Если бы я хотел запустить это на трех файлах, скажем, образцах A, B и C, я бы использовал что-то вроде find с xargs или параллельным:
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 с быстрой заменой регулярных выражений. Но я бы хотел сделать это с помощью быстрого однострочного текста.
Заранее спасибо.