複数のファイルをソースし、1つのファイルを出力します。

複数のファイルをソースし、1つのファイルを出力します。

次の変数を含む「conf1」というファイルがあります。

name='john'
last=''
custom='1000'

他のファイルの名前はconf2で、次のようになります。

name='john'
last='star'

1つのファイルにマージしたいのですが、マージされたファイルにはインポートされたのと同じ順序で変数が含まれています。

たとえば、最初にconf1を取得してからconf2を取得すると、conf2の変数はconf1を上書きします。しかし、conf2にない変数もあります。

一意で最後のソースである変数のみを含む1つのファイルをマージして生成したいと思います。

希望の出力:conf3

name='john'
last='star'
custom='1000'

可能ですか?

答え1

次のことができます。

$ awk -F= '{l[$1]=$0};END{for (i in l) print l[i]}' conf1 conf2
custom='1000'
last='star'
name='john'

出力の行の順序は保証されていませんが(awk配列がハッシュテーブルに内部的に格納される方法に応じて)、設定の優先順位がconf2優先されますconf1

どこ

  • awk -F= ... conf1 conf2=conf ファイルで区切り文字で awk を呼び出します。
  • {l[$1]=$0}各変数の定義を保存します。最新の変数が最も古い変数を上書きします。
  • END{ ... }最後に(すべてのファイルを処理した後)
  • for (i in l)すべての変数を繰り返します。
  • print l[i]そして印刷してください。

答え2

パール方法:

$ perl -F= -lane '$k{$F[0]}=$F[1]; END{print "$_=$k{$_}" for keys(%k)}' conf1 conf2 
last='star'
name='john'
custom='1000'

これはStéphaneの答えと同じ答えです。変数名がキーで、その値が値であるハッシュを作成します。次に、すべてのファイルを処理し、キーと値のペアを印刷します。行の順序は保証されず、呼び出し間で変更される可能性がありますが、値はconf2常に値より優先されますconf1

答え3

優先順位を取得するには、パラメータの前にconf2来る必要があります。 conf1sort

sort -suk1,1 -t= conf2 conf1 | tac

出力:

name='john'
last='star'
custom='1000'

上記はラベルに依存し、目的のcustom出力順序に従ってlast適切にソートされます。nameただし、このパターンはラベル名が異なる方法で指定された場合に機能します。

eval srx=\" 's/^'{name/1,last/2,custom/3}'=&/;' \"   # sort seq: 1,2,3,etc
sort -suk1,1 -t= conf2 conf1 | sed "$srx" | sort -n | cut -d= -f2-    

答え4

これを使用してください:

name=${name:-John}
last=${last:-}
custom=${custom:-1000}

...他のファイルにも同じです。シェルのマニュアルページをお読みください。変数が既に設定されていて null でない場合は、変数を指定された値に設定します。ファイルの取得順序に関係なく、少なくとも表示されるサンプルデータの場合は重要ではありません。

関連情報