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

Результатом этого кода является два файла 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 

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 
  • Шелл-скрипт для печати наиболее посещаемых каталогов
  • Преобразование строк в группы строк
  • Ярлык приложения для запуска загрузки системы
  • Как я могу писать потоки, чтобы получить информацию о торрентах?
  • bash - получить pid для скрипта, используя имя файла сценария
  • Gnome Terminal - кнопка для запуска команды
  • захватить несколько строк после соответствующей целевой линии
  • как сравнить десятичное значение с целым числом в сценариях оболочки?
  • Планировщик вакансий
  • как сравнить общий файл
  • получить вывод `top` для неинтерактивной оболочки
  • UNIX Script не читает папки с пробелами
  • Interesting Posts

    запустить сценарий оболочки, откуда он прекратил выполнение

    как создать пользовательский сеанс рабочего стола для x2go

    Запуск сценария при запуске и после переключения сети

    Как я могу защитить эти два сценария, используемые в SSH authorized_keys дальше?

    Что происходит, когда вы «монтируете» существующую папку с содержимым?

    Синяя градиентная линия сверху и снизу вместо Ubuntu-USB-Grub-Screen

    Cygwin: компакт-диск для Windows легко

    Вычисление общего трафика, генерируемого приложением в сети

    Как избежать повторения команд sed при добавлении сайтов в лак?

    Медленная реакция клавиатуры в некоторых Distros

    команда не найдена, ручка не работает для URL-адреса

    Как получить информацию о слове, размере адреса, размере адресной шины, размере шины данных и размере шины?

    Как завершить сеанс tmux и процессы, которые он породил

    Цепочка сеансов SSH

    Linux-дистрибутив полностью работает на Wayland (нет X11)?

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