テスト名を含むリストファイルが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に指示します。詳細:
NR
awkがこれまでに読んだ行の総数。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