私は開発者ではありませんが、SVNリポジトリから特定のテーブル名を含むファイルを検索する必要があるいくつかの要件があります。私はここで読んだ多くの内容に基づいてこのスクリプトを作成しました。
printf "table_name, file_name, full_path\n" >> export_list.txt
while read table
do
extract=($(egrep -ilrs $table /path/to/file | egrep -i tag | egrep -v backup))
file_name=$(basename $extract)
printf "$table, $file_name, $extract\n" >> export_list.txt
done < table_list.txt
私はこの結果を期待しています
table_name, file_name, full_path
SOMETABLENAME, SomeFileName, /path/to/file/tag1.0/SomeFileName
SOMETABLENAME, SomeFileName, /path/to/file/tag2.0/SomeFileName
SOMETABLENAME, SomeFileName1, /path/to/file/tag1.0/SomeFileName1
SOMETABLENAME, SomeFileName1, /path/to/file/tag2.0/SomeFileName1
代わりに、SOMETABLENAMEに対して見つかった最初の行である1行のみを返します。
配列の使用は次のようになります。 この投稿。私も読んだリンクポストしかし、正直、よく理解していません。
私のスクリプトに他の問題(間違ったgrepなど)がある場合、または他のより良いアプローチがある場合は感謝します。
編集する:
table_list.txtには2000行があります。
BI_CLAIMS_SUMMARY
BI_CLAIMS_SUMMARY_AUDIT
BI_MEDS_AUDIT
BI_MEDS_PATIENTS
BI_MEDS_SUMMARY
編集する:
Jessieが以下のように変更しましたが(ありがとう)、出力は私が(間違った)配列バージョンを使用する前と非常に似ているようです。
table_name, file_name, full_path
BI_CLAIMS_SUMMARY, nohup.out, /sas/data/prod/EIP/depot/hiu/data_extract/tags/1.2/source/pl_sql/bi_claims_sum_plan_proc.sql
/sas/data/prod/EIP/depot/hiu/data_extract/tags/1.2/source/pl_sql/bi_claims_sum_proc.sql
/sas/data/prod/EIP/depot/hiu/sql_refresh/tags/1.0/source/10_load_claims_summary_audit_sqlserver.sas
/sas/data/prod/EIP/depot/hiu/sql_refresh/tags/1.0/resources/automation/nohup.out
BI_CLAIMS_SUMMARY_AUDIT, 10_load_claims_summary_audit_sqlserver.sas, /sas/data/prod/EIP/depot/hiu/data_extract/tags/1.2/source/pl_sql/bi_sum_claims_audit_proc.sql
/sas/data/prod/EIP/depot/hiu/data_extract/tags/1.3/source/pl_sql/bi_sum_claims_audit_proc.sql
/sas/data/prod/EIP/depot/hiu/data_extract/tags/1.4/source/pl_sql/bi_sum_claims_audit_proc.sql
/sas/data/prod/EIP/depot/hiu/meds/tags/1.0/source/HIU_RISK_REFRESH_CLAIMS_SUMMARY_AUDIT.sas
/sas/data/prod/EIP/depot/hiu/sql_refresh/tags/1.0/source/10_load_claims_summary_audit_sqlserver.sas
BI_CLAIMS_SUMMARYがすべての行に表示されることを期待しています。また、ファイル名 nohup.out が file_name の下に表示されるため、grep の出力は正しく分割されません。
ベストアンサー1
申し訳ありません。現在、あなたの問題が何であるかはわかりませんが、配列を呼び出す方法に関連していると思います。次の提案があります。
n=0
printf '%s,%s,%s\n' 'table_name' 'file_name' 'full_path' >> export_list.txt
while read -r table
do
extract[$n]=$(egrep -ilrs "$table" /path/to/file | egrep -i tag | egrep -v backup)
file_name=$(basename "${extract[$n]}")
printf '%s,%s,%s\n' "$table" "$file_name" "${extract[$n]}" >> export_list.txt
n=$((n+1))
done < table_list.txt
- 書式
printf
文字列は常に実際の内容から分離する必要があります。 (printf '%s,%s,%s\n' 'table_name' 'file_name' 'full_path'
) - パラメータを使用するときは、ほぼ常にパラメータを
read
使用する必要があります。これにより、エスケープされた文字をリテラルとして-r
読み取ることができます。\
- いつも変数を二重引用符で囲みます。なぜならこれそしてこれ。
- 配列/配列要素を参照するときは、特別な構文を使用する必要があります。つまり
${array[@]}
、(全体配列)または${array[0]}
(配列の最初の要素)です。呼び出すと、$array
常に最初の要素だけが得られます。 - 上記の理由から、各反復で正しい配列要素を取得する方法が必要です。そのために、
n
ループが繰り返されるたびに増加する変数を追加しました。
注:ここでは配列を使用する必要はまったくないようです。コードをextract
他の場所で引き続き使用しない限り、単に変数に設定してループを繰り返すたびにリセットできます。
また、あなたの質問には「シェルスクリプト」というタグが付けられていますが、POSIX標準では配列を指定していないため、ほとんどの/bin/shバージョンが配列をサポートしていますが、あなたのバージョンも配列をサポートしているという保証はありません。