Две разные ссылки на файлы в циклах bash for одновременно

Есть ли способ одновременно использовать две разные ссылки на файлы в циклах for? Что-то типа:

for file in file1 file2 file3; for name in name1 name2 name3
do
  awk 'FNR==NR{a[$1];next};($1 in a)' ${file}.txt ${name}.txt > ${name}_extract.txt
done

Я также пробовал с вложенным циклом for, который не работал:

for file in file1 file2 file3
do
  for name in name1 name2 name3
  do
    awk 'FNR==NR{a[$1];next};($1 in a)' ${file}.txt ${name}.txt > ${name}_extract.txt
  done
done

Чего я хотел бы добиться, так это извлечь строки из «file1.txt» и «name1.txt», которые соответствуют их первому столбцу. И наоборот для файла2.txt/имя2.txt и файла3.txt/имя3.txt.

Для двух циклов for требуются операторы дваdo. Вам не хватает одного.

John1024 10.04.2019 21:28

В будущем, когда у вас будет ошибка сценария оболочки, хорошим первым шагом будет вырезать и вставить ваш код в shellcheck.net и исправить ошибки (важные) и предупреждения (могут быть важными), которые он идентифицирует. Если у вас есть проблемы с пониманием его сообщений, зайдите сюда и спросите.

John1024 10.04.2019 21:29

@John1024 John1024 Да, я пропустил одно утверждение do, хотя оно все еще не работает, см. редактирование. Он не выдает ошибок, но все выходные файлы, кроме одного, пусты.

lindak 10.04.2019 21:58

Вы пытаетесь перебрать все комбинации переменных (например, «файл1» и «имя1», затем «файл1» и «имя2», затем «файл1» и «имя3», затем «файл2» и «имя1» и т. д.) или сразу над соответствующими элементами (т.е. просто «файл1» и «имя1», затем «файл2» и «имя2», затем «файл3» и «имя3»)? Две петли дадут вам все комбинации; если вам нужны только соответствующие элементы, вам нужен один цикл (и, возможно, элементы в массивах).

Gordon Davisson 10.04.2019 22:20
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
4
33
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Если файлы и имена действительно называются file1, file2, file3 и name1, name2 и name3, то можно сделать примерно так:

for i in {1..3}; do
    printf '%s\n' "file: file$i, name: name$i"
done

Вы заменяете оператор printf тем, что вам нужно — важная часть — это то, как вы получаете доступ к файлам и именам.

Однако, если они имеют произвольные имена, вам нужно сделать что-то вроде подготовки двух массивов, а затем выполнить цикл по индексам:

files=(file1 file2 file3)
names=(name1 name2 name3)
for (( i = 0; i < ${#files[@]}; ++i )); do
    printf '%s\n' "file: ${files[i]}, name: ${names[i]}"
done
Ответ принят как подходящий

Из вопроса неясно, хотите ли вы запустить 3 итерации или 9. Если вы хотите только 3 итерации, мне нравится формат:

while read file name; do 
  ...
done << EOF
file1 name1
file2 name2
file3 name3
EOF

Отлично, спасибо @William Pursell, это прекрасно работает!

lindak 11.04.2019 08:33

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