Использование массива для динамической передачи файлов в команду в UNIX - PullRequest
0 голосов
/ 03 июля 2018

У меня есть четыре файла (file_one до file_four), содержимое этих файлов не очень важно. Я хочу передать три из этих файлов команде (т. Е. paste или awk) в определенном порядке, определенном массивом. Мой массив order=(two one four). Я надеялся использовать массив для передачи нужных файлов в команду в качестве входных данных так же, как вы могли бы использовать * (т.е. paste file_* > combined_file);

paste file_${order[@]} > combined_file

paste file_"${order[@]}" > combined_file

paste file_"${order[*]}" > combined_file

paste file_"{${order[@]}}" > combined_file

paste file_{"${order[@]}"} > combined_file

Я просмотрел разные страницы ( 1 , 2 , 3 или 4 ), но не могу их найти работать. loop через файлы не работает в случае paste или awk. Я хочу передать файлы сразу команде. Видя, что мои UNIX знания ограничены, я, возможно, неправильно истолковал некоторые решения / ответы. Из того, что я понимаю из этого ответа , могут возникнуть некоторые проблемы с тем, как массивы изначально разрабатывались в bash.

Желаемый результат: paste file_two file_one file_four > combined_file

Ответы [ 2 ]

0 голосов
/ 03 июля 2018

Вы можете использовать printf:

paste $(printf "file_%s " ${order[@]}) > combined_file

Это позволяет избежать циклического перебора всех элементов массива order.


В качестве альтернативы, используя bash ism , вы можете использовать это:

paste ${order[@]/#/file_} > combined_file

Обратите внимание на #, который соответствует началу шаблона, как упомянуто на справочной странице bash:

$ {параметр / шаблон / строка}

(...) Если шаблон начинается с #, он должен совпадать в начале расширенного значения параметра.

0 голосов
/ 03 июля 2018

Вы можете использовать цикл for в $ ():

paste $(for i in ${order[@]}; do echo file_$i; done) > output_file
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...