Compare dois arquivos e modifique a entrada na partida

0

Eu quero comparar file1 com file2 .

file1 contém um conjunto de nomes de caminho e file2 contém um conjunto de palavras.

Se algum nome de caminho contiver alguma das palavras no segundo arquivo, ele deve ser comentado com a linha anterior com // .

file1 :

xxx/AAA.tmp.v
xxx/BBB.tmp.v
xxx/CCC.tmp.v

file2 :

BBB
CCC
FFF

Saída desejada em um novo arquivo:

xxx/AAA.tmp.v
// xxx/BBB.tmp.v
// xxx/CCC.tmp.v
    
por Khanh Nguyen 26.09.2017 / 05:56

2 respostas

1

Você pode usar awk .

awk -F"[/.]" 'NR==FNR{seen[$0];next} 
    ($2 in seen){print "// "$0; next}1
' file2 file1
  • -F"[/.]" define delimitadores de campos como barra / ou ponto . .
  • NR==FNR isto é verdade sempre para os primeiros dados de entrada (aqui file2), R ecord N umber == F ile R ecord N umber.
  • seen[$0];next se acima for verdadeiro, então segure a linha inteira do arquivo2 no array chamado seen , então leia a próxima linha next (na verdade vá primeiro e execute este bloco novamente até NR!=FNR )
  • ($2 in seen){print "// "$0; next}1 aplica-se apenas ao segundo arquivo de entrada (aqui arquivo1) e procura pela matriz seen se contiver a mesma sequência da coluna # 2 $2 no arquivo1 e, em seguida, imprimir toda a linha do arquivo1 com% co_de pré-anexado %, e goto // check condition novamente até a correspondência, caso contrário, imprima a linha inteira com a condição next (que é a ação padrão enable 1 ).
por 26.09.2017 / 06:03
0

Com sed você pode fazer assim:

sed '/tmp/!{H;d;}
G;s/$/\
/;s_.*\(..*\).*\n\n_// &_
P;d' file2 file1

Você coleta os padrões de arquivo2 no espaço de armazenamento e, para cada linha de arquivo1, você anexa essa coleção e verifica com referências anteriores se o padrão é encontrado na linha.

Para uma explicação mais detalhada, consulte esta pergunta e resposta .

Note que usei a string tmp como indicação de que estamos no arquivo1; talvez seja necessário adaptar isso ao seu caso real. A estranha substituição começando na linha 2 adiciona uma nova linha ao final, então sabemos que cada padrão será cercado por novas linhas.

    
por 26.09.2017 / 07:51