파일 목록이 있고 데이터베이스 테이블 목록에서 다음 파일을 검색하고 싶습니다.
[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
입력 파일만 살펴보고 결과를 각 파일의 전체 경로가 포함된 세 번째 파일에 출력하는 간단한 셸 스크립트를 만들어 프로세스를 단순화하려고 했습니다. 본질적으로 다음과 같습니다(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
이렇게 하면 작업이 완료되는 것 같습니다. 당신의 응답을 주셔서 감사합니다! 더 좋은 방법이 있나요?