次の変数を含む「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
来る必要があります。 conf1
sort
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 でない場合は、変数を指定された値に設定します。ファイルの取得順序に関係なく、少なくとも表示されるサンプルデータの場合は重要ではありません。