File1とFile2を比較して、File2で一致するパターンをコメントアウトします。

File1とFile2を比較して、File2で一致するパターンをコメントアウトします。

テスト名を含むリストファイルが2つあります。 1つのファイルにはデフォルトのテスト名が含まれています(例:)。usb30_tb_7_10他のファイルには'include "usb30_tb_7_10.sv".I want to get all names (すべての名前を取得したい)リスト`これはデフォルト名(または.svを除く)で、次の場所で検索します。リスト2行全体をコメントアウトします。

つまり:

リスト1

test1
test3

コメントする前にリスト2

'include "test1.sv"
'include "test2.sv"
'include "test3.sv"
'include "test4.sv"

比較後のリスト2

//'include "test1.sv"
'include "test2.sv"
//'include "test3.sv"
'include "test4.sv"

私はgrep / sed / awkを初めて使用していましたが、まだ解決策が見つかりませんでした。

awkが特定のパターンを入力として使用することに関する回答を見ましたが、それほど役に立ちませんでした。

私は以下を試してみます:

awk '-include list1.lst {print "// " $0; next} 1' list2.sv

しかし、うまくいきません。

ベストアンサー1

awkを使用してください:

$ awk -F'[".]' 'NR==FNR{a[$0]; next} $2 in a{$0="//"$0} 1' list1 list2
//'include "test1.sv"
'include "test2.sv"
//'include "test3.sv"
'include "test4.sv"

仕組み:

  • -F'[".]'

    "これはawkに、または発生時にフィールドを区別するように指示します.

  • NR==FNR{a[$0]; next}

    最初のファイルを読み取ると、これはlist連想配列のa現在の行と同じキーを生成し、残りのコマンドをスキップしてその行nextにジャンプするようにawkに指示します。

    詳細:NRawkがこれまでに読んだ行の総数。 FNR現在のファイルからこれまでに読み込んだ行数です。この時点で、FNR==NR私たちは最初のファイルを読んでいます。

  • $2 in a{$0="//"$0}

    2番目のファイルを読み取ると、現在の行の2番目のフィールドが連想配列のキーである場合は、行の先頭に追加するように//awkに指示しますa

  • 1

    これはprint-the-lineのawkの神秘的な速記です。

拡張例

コメントに記載されている追加の行を使用してください。

$ cat list1
test1
test3
usb30_suspend_resume
$ cat list2
'include "test1.sv"
'include "test2.sv"
'include "test3.sv"
'include "usb30_suspend_resume.sv"
'include "test4.sv"
$ awk -F'[".]' 'NR==FNR{a[$0]; next} $2 in a{$0="//"$0} 1' list1 list2
//'include "test1.sv"
'include "test2.sv"
//'include "test3.sv"
//'include "usb30_suspend_resume.sv"
'include "test4.sv"

Pastebin ファイルの適用

Pastebinのファイルにはlist1に末尾のスペースがあり、両方のファイルにWindowsスタイルの行末があります。この形式を処理するには、次のようにします。

awk 'NR==FNR{a[$1]; next} $2 in a{$0="//"$0} 1' FS='[[:space:]]' list1.txt FS='[".]' list2.txt

おすすめ記事