リストファイルを使用してベースファイルから2番目のリストを抽出し、いくつかの行をコメントアウトするのはどうですか?

リストファイルを使用してベースファイルから2番目のリストを抽出し、いくつかの行をコメントアウトするのはどうですか?

2つのファイルがありますmaster.tblsites.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ファイルを検索する必要があるWebサイトのリストです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仮定 )。HAWAII23sites.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"(例:サイト名+文字列)。次に、3番目のフィールドの値を抽出し、条件が満たされると(2番目のフィールドが2に属し2より大きい)、最初と3番目のフィールドを印刷して行をコメントアウトします。ファイルをその場で編集するわけではありませんが、すべてがうまく機能する場合は、いつでも別のファイルにリダイレクトして元のファイルを上書きできます(最近はオプションがあります)。-ADMzmaster.tbl-Ppzpstoplist.lst
gnu awk-i inplace

関連情報