2016-04-19 5 views
2

私たちは、カンマ区切りに含まれるファイルの名前parameters.txtがあります。またコンマ値を使用して存在しない場合は、ファイルにコンテンツを追加は

db.hostname,db.username,db.password,db.url,db.status,codesettingsA, codesettimgsB 

は、私たちがメインファイルと呼ばれるのproperties.txtを持っているしています行形式を含む

db.hostname=hostname 
db.username=username 
db.password=password 

parameters.txtにコンマ区切りの値を渡して、それがproperties.txtに存在するかどうかを確認する必要があります。存在しない場合は、プロパティの一番下が印刷されます。

例:properties.txt:db.url、db.status、codesettingsAおよびcodesettimgsBは存在しません。しかし、私はparameters.txtから渡しています。これは、追加されると、結果はのproperties.txtにこのようにする必要があります:

db.url 
db.status 
codesettingsA 
codesettimgsB 

注:すでに値はdb.hostname =ホスト名、db.username =ユーザ名とdb.passwordのために宣言されている=プロパティファイルにパスワード。私はdb、hostname、db.username、db.passwordをパラメータファイルから渡しています。したがって、これはカンマの後でも値を無視し、db、hostname、db.username、db.passwordを出力しません。

properties.txtの一番下のページに印刷する方法はありますか? サンプルコードを提供できますか?

答えて

1

あなたはこのAWKを使用することができます。

awk 'FNR==NR{for (i=1; i<=NF; i++) a[$i]; next} $1 in a{delete a[$1]} 1; 
    END{for (i in a) print i "="}' FS=' *, *' params.txt FS=' *= *' props.txt 

出力:

db.hostname=hostname 
db.username=username 
db.password=password 
codesettimgsB= 
db.url= 
codesettingsA= 
db.status= 
+0

こんにちはanubhava、 あなたの返信ありがとう、 現在、このコマンドは行全体をチェックしています。私たちのファイルでは、以下のようにプロパティを初期化しました: Db.username = username Db.password =パスワード 最初の部分だけをチェックする必要があります。たとえば:最初の部分のdb.usernameがある場合、それは印刷しないでください。これを達成するためのサンプルコードはありますか? – Rashid

+0

こんにちはanubhava、ありがとう! それが生成する必要があり Db.username =ユーザ名 Db.password =パスワード を提出我々は性質を持っている、codesettimgsB 、まだ同じである私たちは、パラメータファイル Db.usernameに持って 、db.password、codesettingsAプロパティで出力ファイルを次のよう codesettingsA をcodesettimgsB それはdb.usernameまたはパスワードを書くべきではありません、それは性質であり、すでにあるファイルとanubhavaこんにちは、それを – Rashid

+0

無視すべきで、ご返信用 おかげで、 私は質問を更新しました – Rashid

2

これを試してみてください:

IFS=',' read -ra params < parameters.txt 
for param in "${params[@]}"; do 
    grep "$param" properties.txt || echo "$param" >> properties.txt 
done 

パラメータが解析され、params配列に格納されています。

各パラメータについて、ループはproperties.txtに存在するかどうかをチェックし、そうでない場合はファイルの最後に追加します。

+0

こんにちはKenavoz、 ご回答ありがとうございました 現在、このコマンドは行全体をチェックしています。私たちのファイルでは、以下のようにプロパティを初期化しました: Db.username = username Db.password =パスワード 最初の部分だけをチェックする必要があります。たとえば:最初の部分のdb.usernameがある場合、それは印刷しないでください。これを達成するためのサンプルコードはありますか? – Rashid

+0

@Rashidプロパティの長さにかかわらず、 'grep'はparamがプロパティの部分文字列かどうかをチェックします。 – SLePort

0
cat properties.txt <(grep -vf properties.txt <(tr ',' '\n' <parameters.txt)) 

tr ..は、csv形式のレコードが改行区切りに変換し、grep ..ないパラメータの行を見つけます。 txtとcat ..に追加すると

+0

このコードは質問に答えるかもしれませんが、_why_および/または_how_に関する追加のコンテキストを に追加すると、 という質問に回答すると、その長期の 値が大幅に改善されます。あなたの答えを[編集]して、説明を加えてください。 –

関連する問題