リスト ファイルを使用して、マスター ファイルから 2 番目のリストを抽出します (一部の行をコメント アウトします)...方法は?

リスト ファイルを使用して、マスター ファイルから 2 番目のリストを抽出します (一部の行をコメント アウトします)...方法は?

2つのファイルがありますmaster.tbl:sites.lst

このファイルはmaster.tbl、ポート構成、ポート名、IP アドレスなどを含むサイトのリストです。サイトの説明、コメントなどを含む行もありますが、これらは無関係です。サイト構成を含む行は次のように配置され、スペースで区切られています。

{server} {SITE NAME} {port name} {configuration flags}

ポート名は、小文字のサイト名、ダッシュ、「P」、およびポート番号で構成されます。

例:

server01 HAWAII23-USR hawaii23-P1 blah-configuration-blah-arguments
server01 HAWAII23-ADM hawaii23-P2 blah-configuration-blah-arguments
server01 HAWAII23-ADM hawaii23-P3 blah-configuration-blah-arguments
server01 HAWAII23-USR hawaii23-P4 blah-configuration-blah-arguments

sites.lstファイルを検索する必要があるサイトのリストですmaster.tbl

次のすべての条件を満たすすべての行をコメントアウトし (#行の先頭に を挿入)、サーバー名とポート名を ( という名前のファイルに) 抽出する必要があります。stoplist.lst

  1. 記載されているサイト名を含むsites.lst
  2. 「-ADM」を含む
  3. ポート番号が '2' より大きい (例: hawaii23-P3)

上記の例では、master.tblファイルは次のようになります。

server01 HAWAII23-USR hawaii23-P1 blah-configuration-blah-arguments
server01 HAWAII23-ADM hawaii23-P2 blah-configuration-blah-arguments
#server01 HAWAII23-ADM hawaii23-P3 blah-configuration-blah-arguments
server01 HAWAII23-USR hawaii23-P4 blah-configuration-blah-arguments

...そして、次のstoplist.lst内容が含まれます (HAWAII23が にあると仮定sites.lst)。

server01 hawaii23-P3

master.lst約 300,000 行なので、これを手動で行うのは...良くありません。

答え1

解決策は次のとおりですawk:

awk 'NR==FNR{z[$0"-ADM"]++;next}
{p=$3;sub(/.*-P/, "", p); if ($2 in z && p > 2)
{print $1,$3 > "stoplist.lst"; $0="#"$0}}1' sites.lst master.tbl

これはsites.lst最初に を読み取り、$0"-ADM"(サイト名 + 文字列-ADM) を配列 のインデックスとして設定しますz。次に、3 番目のフィールドのmaster.tbl後の値を として抽出する処理を行い、条件が満たされた場合 (2 番目のフィールドが であり、2 より大きい場合)、1 番目と 3 番目のフィールドを に出力し、行をコメント アウトします。 ファイルはその場で編集されないことに注意してください。ただし、問題がなければ、いつでも別のファイルにリダイレクトして元のファイルを上書きできます (ただし、最近の ではオプション があります)。-Ppzpstoplist.lst
gnu awk-i inplace

関連情報