forループは複数のタスクを完了できます

forループは複数のタスクを完了できます

このコードの出力は2つのtxtファイルです。両方に対してforループを作成できますか?つまり、forループは2つ以上の出力を提供しますか? ID1とID2にはファイル名があります。 ID1とID2の各項目の最初の行を印刷し、それを出力1と出力2として保存したいが、2つのforループを使用したくない。私が探しているのは、タスクを実行するforループです。

#!/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

ベストアンサー1

さて、私は変数のパス名が何であるかを理解したようです。

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

考えるこれはあなたが追求することを達成します。もしそうなら、すべて、つまりcat

言い換えれば、ここで分割するときにcat値を明確にし、拡張子でファイル名全体を解釈しないことが重要です。そのファイルの内容がわからないため、これ以上の提案はできません。$IFSfor ... in $(cmd sub)$IFSset -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 -r l <"$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 -r l <"$in/$f/a/s/t$n/$n.txt"
printf %s\\n "$l"
done

おすすめ記事