
ファイルリストがあり、データベーステーブルリストから次のファイルを検索したいと思います。
[root@host hs]# head -n 3 tables
rec_playinth120116
rec_playinth120216
rec_playinth120316
[root@host hs]# head -n 3 files
0128184628OV30.wav
0128780332OV30.wav
0128439969OV30.wav
入力ファイルだけを見て、結果を各ファイルのフルパスを含む3番目のファイルに出力する単純なシェルスクリプトを作成してプロセスを簡素化しようとしました。基本的には次のようになります(sedは他のプロセスへの入力として使用できる通常のファイルパスに出力を削除します)。
psql -d task_hst -A -P tuples_only=on -c "select f_path, file_name from $TABLES where file_name = ''$FILES''"|sed 's/|/\//g' >> $OUT
forループで実行すると、明らかにすべてのファイルをすべてのテーブルと比較しません。目的の結果が得られた唯一の方法は、各テーブルをハードコーディングして別々のコマンドで実行することでした。つまり、次のようになります。
for x in $FILE
do
psql -d task_hst -A -P tuples_only=on -c "select f_path, file_name from rec_playinth120116 where file_name = '$x'"|sed 's/|/\//g' >> $OUT
psql -d task_hst -A -P tuples_only=on -c "select f_path, file_name from rec_playinth120216 where file_name = '$x'"|sed 's/|/\//g' >> $OUT
psql -d task_hst -A -P tuples_only=on -c "select f_path, file_name from rec_playinth120316 where file_name = '$x'"|sed 's/|/\//g' >> $OUT
これは最もエレガントでユーザーフレンドリーな作業方法ではありません。
理想的には、ファイル名は次のようにスクリプトを実行したときに渡される入力になります。
while true
do
read -r f1 <&3 || break
read -r f2 <&4 || break
psql -d task_hst -A -P tuples_only=on -c "select f_path, file_name from $f1 where file_name = '$f2'"|sed 's/|/\//g' >> $OUT
done 3<$1 4<$2
ただし、指定されたすべてのテーブルを引き続き検索する必要がある場合は、最初の結果を見つけて中断します。
whileやPasteのような方法でこれを行う方法があることを知っていますが、これは私の技術の範囲外です。これを達成する簡単な方法はありますか?
答え1
@barun はい、そうです。 「デカルト積」がそれを説明する用語かはわかりませんが。私はこの情報についていくつかの調査を行い、次の結論に達しました。
while read line1
do
while read line2
do psql -d task_hst -A -P tuples_only=on -c "select f_path, file_name from $line1 where file_name = '$line2'"|sed 's/|/\//g' >> $OUT
done < $2
done < $1
これで作業が完了するようです。お返事ありがとうございます!もっと良い方法がありますか?