Один для цикла для многих задач

Результатом этого кода является два файла txt. Могу ли я сделать один для цикла для обоих из них. т.е. один для цикла, чтобы дать мне два или более выходов? В ID1 и ID2 у меня есть имена для файлов. Я хочу напечатать первую строку для каждой записи в ID1 и ID2 и сохранить ее как output1 и output2, но я не хочу использовать два для циклов. То, что я ищу, это одно для цикла, чтобы выполнить эту работу.

#!/bin/bash in=/a/b/c li=/a/b/c/d/ g1=/a/s/t1/1.txt g2=/a/s/t2/2.txt for i in $(cat $li/ID1.txt); do sed '1q;d' ${in}/${i}/${g1}; done > output1.txt for i in $(cat $li/ID2.txt); do sed '1q;d' ${in}/${i}/${g2}; done > output2.txt 

  • Насколько полезен сценарий Linux?
  • Массовое добавление пользователей в группы
  • UNIX Script не читает папки с пробелами
  • Получить код выхода команды, выполняемой командой linux script
  • Проверьте пароль пользователя с помощью сценария оболочки
  • bash - получить pid для скрипта, используя имя файла сценария
  • Как сделать N-образный diff?
  • как сравнить общий файл
  • 2 Solutions collect form web for “Один для цикла для многих задач”

    В этом конкретном случае вам вообще не нужен цикл:

     #!/usr/bin/env bash in=/a/b/c li=/a/b/c/d/ g1=/a/s/t1/1.txt g2=/a/s/t2/2.txt files1=$(sed "s#^#${in}/#;s#\$#/${g1}#" $li/ID1.txt | tr '\n' ' ') files2=$(sed "s#^#${in}/#;s#\$#/${g2}#" $li/ID2.txt | tr '\n' ' ') head -qn 1 $files1 > output1 head -qn 1 $files2 > output2 

    files1=... использовали sed чтобы добавить $in в начало каждой строки и $g1 до конца. Это должно привести к списку целевых имен файлов. Затем вы можете передать все команды sed которые печатают 1-ю строку.

    ВАЖНО : Это предполагает, что ваши имена файлов являются нормальными (не содержат пробелов, символов новой строки или других странных символов). Если это не так, сообщите мне, и я постараюсь предоставить более надежный ответ. Обратите внимание, что ваш исходный подход с циклом for также завершится неудачей с именами файлов с пробелами.


    В общем, независимо от того, на каком языке вы работаете, если вы обнаруживаете, что пишете повторяющийся код, вы должны подумать о функции:

     #!/usr/bin/env bash in=/a/b/c li=/a/b/c/d/ g1=/a/s/t1/1.txt g2=/a/s/t2/2.txt firstline(){ _in="$1" _g="$2" file="$3" while read i do sed '1q;d' ${in}/${i}/${g} done < "$file" } firstline "$li/ID1.txt" "$in" "$g1" > output1.txt firstline "$li/ID2.txt" "$in" "$g2" > output2.txt 

    Хорошо, я думаю, я понимаю, что теперь видят переменные в переменных.

     for n in 1 2; do n=$n.txt for f in $(cat "$li/ID$n") do IFS= read -rl <"$in/$f/a/s/t${n%.*}/$n" printf %s\\n "$l" done > "output$n"; done 

    Я думаю, что он выполняет то, что вам нужно. Если это так, он делает все это с помощью встроенных оболочек – то есть, кроме cat .

    И говоря о cat – при расщеплении с $IFS как вы здесь, с for ... in $(cmd sub) важно быть явным о значении $IFS и set -f чтобы избежать толкования глобы файлов, интерпретируемых в расширение. Потому что я не знаю содержимого файла, но я не могу ничего посоветовать.

    Другой способ может включать ограничитель нулевой строки. Это сильно зависит от расщепления $IFS хотя это зависит от расширения, не включающего ни одной нулевой строки, потому что оно использует один в качестве маркера. Если вы не изменяете $IFS и его значение по умолчанию, то расширение $(cat file) не будет содержать никаких нулевых строк. Это может произойти примерно так:

     io=/a/s/t1/1.txt for f in $(cat "$li/ID1.txt") '' $(cat "$li/ID2.txt") do [ -z "$f" ] && io=/a/s/t2/2.txt && continue IFS= read -rl <"$in/$f/$io" printf %s\\n "$l" >> "output${io##*/}" done 

    Или вы даже можете сделать …

     n=0 for f in '' $(cat "$li/ID1.txt") '' $(cat "$li/ID2.txt") do [ -z "$f" ] && exec >"output$((n+=1)).txt" && continue IFS= read -rl <"$in/$f/a/s/t$n/$n.txt" printf %s\\n "$l" done 
    Interesting Posts

    KDE Plasma: сообщения Skype открывают панель и не закрываются, пока не будут нажаты

    Xfce 4.12: Как настроить диалоговое окно переключателя окон (Alt-Tab) для использования режима списка?

    Двойная загрузка системы Linux с шифрованием

    Каковы недостатки публикации публикации dmidecode публично?

    Заставить владельца и группу для содержимого tar-файла?

    Как работают менеджеры шрифтов в Fedora?

    expressvpn всегда заблокирован

    Почему SIGINT не работает в фоновом режиме в скрипте?

    rsync зависает, если я не дефрагментирую файловую систему ext4

    Сценарий Bash с кавычками и пробелами

    Имя хоста не будет разрешено после настройки нового сервера

    grep для строки в нескольких файлах под tar и print wc -l

    network.service Не удалось запустить LSB: создать сеть вверх / вниз – Centos 7

    bash: невозможно создать временный файл для здесь-документа: на устройстве нет места

    Запретить разрешение монтировать любые диски пользователю

    Linux и Unix - лучшая ОС в мире.