Usando o 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"
Como funciona:
-
-F'[".]'
Isso informa ao awk para separar os campos sempre que um
"
ou.
ocorre. -
NR==FNR{a[$0]; next}
Ao ler o primeiro arquivo,
list
, isso diz ao awk para criar uma chave na matriz associativaa
igual à linha atual e, em seguida, pular o restante dos comandos e pular para a linhanext
.Mais detalhes:
NR
é o número total de linhas que o awk leu até agora.FNR
é o número de linhas lidas até agora do arquivo atual. Isso, quandoFNR==NR
, estamos lendo o primeiro arquivo. -
$2 in a{$0="//"$0}
Ao ler o segundo arquivo, isso diz ao awk para adicionar
//
ao início da linha se o segundo campo na linha atual for uma chave na matriz associativaa
. -
1
Esta é uma abreviada enigmática do awk para imprimir a linha.
Exemplo estendido
Usando a linha adicional mencionada nos comentários:
$ 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"
Adaptando para arquivos pastebin
Os arquivos em pastebin têm espaços em branco à direita em list1 e ambos os arquivos têm terminações de linha no estilo windows. Para lidar com esse formato, use:
awk 'NR==FNR{a[$1]; next} $2 in a{$0="//"$0} 1' FS='[[:space:]]' list1.txt FS='[".]' list2.txt