出力ファイルの文字列値をソースファイルの文字列に置き換えます。

出力ファイルの文字列値をソースファイルの文字列に置き換えます。

これらの値、特にファイルの下部に名前が付けられている既存のファイルの「記号とコロン」の間の=値を変更する必要があります。つまり、:zoo.cfg

...
Server.1=10.42.227.70:2891:3881
Server.2=10.42.229.63:2891:3881
Server.3=10.42.234.18:2891:3881
...

ホストファイル(つまりソースファイル)の値を使用します。

10.42.227.66    zoo1
10.42.229.119   zoo2
10.42.234.21    zoo3

誰でもこれを行う方法を案内できますか?

また、Zoo.cfgファイルのServer.1はZoo1と同じで、Server.2はZoo2と同じで、Server.3はZoo3と同じです。

問題を追加するには、ホストファイルには複数の異なるホスト(Zoo1、Zoo2、およびZoo3以外のホストなど)のエントリがあります。 Hosts ファイルの内容は次のとおりです。

10.42.224.153 dev.nifi1.datacond.dfc
10.42.229.87 dev.nifi2.datacond.dfc
10.42.236.46 dev.nifi3.datacond.dfc
10.42.231.56 zoo1
10.42.224.225 zoo2
10.42.239.41 zoo3
10.42.233.198 controlnode
10.42.231.56 node-master
10.42.230.71 node1
10.42.237.120 node2

Zooホスト行のみを処理するようにawkスクリプトを変更する方法はありますか?つまり、他のすべてのホストエントリは無視されますか?

ベストアンサー1

awkを使用してください。

$ cat tst.awk
NR == FNR {
    map[$2] = $1
    next
}
FNR == 1 {
    tgt = FILENAME
    sub(/\.[^.]*$/,"",tgt)
}
{
    key = $1
    sub(/=.*/,"",key)
    sub(/.*\./,"",key)
    key = tgt key
}
key in map {
    sub(/=[^:]+/,"=" map[key])
}
{ print }

$ awk -f tst.awk hosts zoo.cfg
...
Server.1=10.42.231.56:2891:3881
Server.2=10.42.224.225:2891:3881
Server.3=10.42.239.41:2891:3881
...

上記の例では、最初のフィールドに s がhost含まれておらず、フィールドにスペースが含まれていないと仮定しています。&

上記は以下の入力ファイルで実行されました。

$ head -50 hosts zoo.cfg
==> hosts <==
10.42.224.153 dev.nifi1.datacond.dfc
10.42.229.87 dev.nifi2.datacond.dfc
10.42.236.46 dev.nifi3.datacond.dfc
10.42.231.56 zoo1
10.42.224.225 zoo2
10.42.239.41 zoo3
10.42.233.198 controlnode
10.42.231.56 node-master
10.42.230.71 node1
10.42.237.120 node2

==> zoo.cfg <==
...
Server.1=10.42.227.70:2891:3881
Server.2=10.42.229.63:2891:3881
Server.3=10.42.234.18:2891:3881
...

おすすめ記事