Перенаправление вывода сценария bash в папку

У меня есть два каталога, из которых я извлекаю определенные столбцы из двух файлов и сохраняю их в новый файл:

shopt -s nullglob
a_files=(/path/to/a_files/*.csv)
b_files=(/path/to/b_files/*.csv)
out_dir=(/path/to/output/folder)

for ((i=0; i<"${#a_files[@]}"; i++)); do
    paste -d, <(cut "${a_files[i]}" -d, -f1-6) \
              <(cut "${b_files[i]}" -d, -f7-) > c_file"$i".csv

done

Код работает, но я бы хотел, чтобы выходные файлы сохранялись в выходном каталоге out_dir и имели имена файлов a_files.

Я пытался использовать >"out_dir/$a_files", но получаю сообщение об ошибке «Нет таких файлов или каталогов».

Как перенаправить выходные файлы в каталог?

Я использую Linux Ubuntu.

Обновлять: a_files и b_files имеют одинаковое количество строк, но находятся в разных папках.

Каталог еще существует? Перенаправление создаст файлы, но не каталоги.

Benjamin W. 13.09.2018 19:12

Кроме того, действительно ли a_files и b_files одинаковы? Если да, то они оба вам не нужны, не так ли?

Benjamin W. 13.09.2018 19:13
$a_files - это то же самое, что и ${a_files[0]}, и это полный путь как /path/to/files/foo.csv, а не только foo.csv.
chepner 13.09.2018 19:30

@BenjaminW. Я предполагаю, что использование OP '/ path / to / files' можно рассматривать как обфускацию его фактических путей, а не как индикатор того, что a_files и b_files фактически находятся в одном каталоге.

Will Barnwell 13.09.2018 21:32

... однако эта обфускация не позволяет кому-либо еще воспроизвести проблему, из-за чего вопрос противоречит правилам минимальный воспроизводимый пример. Код в вопросе должен быть кратчайшим, что можно успешно протестировать, чтобы воспроизвести проблему во всех существенных аспектах до, в котором задается вопрос.

Charles Duffy 13.09.2018 21:56

(В идеальном мире репродуктор должен содержать команды для Создайте A, B и выходных каталогов, а также несколько файлов CSV внутри каждого, чтобы можно было воспроизвести проблему или проверить ответ, просто скопировав и вставив прямо в командную строку) .

Charles Duffy 13.09.2018 22:40

@Buzz: Вы имели в виду b_files=(/different_path/to/files/*.csv)? Если да, обновите свой вопрос, если нет, см. Комментарии выше ;-). Удачи.

shellter 14.09.2018 00:30

Файлы a_files и b_files находятся в разных папках. Я должным образом обновил вопрос, чтобы отразить это.

Buzz 14.09.2018 13:35
0
8
464
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий
a_files=(/path/to/files/*.csv)
b_files=(/path/to/files/*.csv)
out_dir="/path/to/output/folder"

# create the output directory
mkdir -p "$out_dir"
for ((i=0; i<"${#a_files[@]}"; i++)); do
    # move the output to "$out_dir" with the filename the same as in ${a_files[i]}
    paste -d, <(cut "${a_files[i]}" -d, -f1-6) <(cut "${b_files[i]}" -d, -f7-) \
      > "$out_dir"/"$(basename "${a_files[i]}")"
done

Но это так мне кажется работой для xargs, но это только я:

a_path="/path/to/files/*.csv"
b_path="/path/to/files/*.csv"
out_dir="/path/to/output/folder"

join -z <(printf "%s\0" $a_path) <(printf "%s\0" $b_path) | xargs -0 -n2 sh -c 'paste -d, <(cut "$1" -d, -f1-6) <(cut "$2" -d, -f7-) > '"$out_dir"'/"$(basename "$1")"' --

интересное использование xargs, но решение join -z кажется головной болью при обслуживании ;-) Просто MHO. Всем удачи.

shellter 14.09.2018 00:32

Это решает мою проблему. Параметр xargs тоже работает, но я остановился на первом ответе. Спасибо всем.

Buzz 14.09.2018 14:36

Другие вопросы по теме