O Awk foi projetado para isso (aqui com GNU awk
para a captura de padrões de chaves combinadas em uma matriz em match()
):
$ awk '
NR == FNR { Ids[$1]++; next; }
match($1, /id=([^;]+);/, Id) && Id[1] in Ids
' /file1 /file2
id=ram;*between*hkjhdswklf kjsdklhglshglkhgklsdgkhdfg
id=taikah;jhdjfkhg**kjdfkjksfdjk dfkjskdfjkljdflkjsdflj
Várias das respostas alternativas propõem soluções que fazem várias suposições sobre o insumo que não são exatamente evidentes na amostra dada pelo OP. Uma coisa que é clara, porém, é que existe uma palavra legítima nos dados após id=xxx;
, por isso não é seguro assumir que um dos IDs de File 1
pode não estar em algum lugar em os dados também.
É por isso que o Awk é muito melhor que o fgrep(1)
. O awk dividirá a entrada em campos que podem limitar a correspondência possível, o que foi feito no exemplo acima, especificando que a correspondência deve estar no primeiro campo ( $1
).
A entrada de exemplo contém alguns dados ao lado do ID, portanto, se você quiser uma maneira completa de comparar os IDs em File 1
, defina o separador de campos ( FS
) como ;
e imprima somente se houver uma correspondência exata.
Suponha que File 2
contenha:
id=ram;*between*hkjhdswklf kjsdklhglshglkhgklsdgkhdfg
id=taikah;jhdjfkhg**kjdfkjksfdjk dfkjskdfjkljdflkjsdflj
id=notinlist;jhdjfkhg**kjdfkjksfdjk ram*dfkjskdfjkljdflkjsdflj
id=notinlist;*between*taikah*hkjhdswklf kjsdklhglshglkhgklsdgkhdfg
Então, o seguinte ainda funcionará
$ awk -v FS=";" '
NR == FNR {Id = "id=" $0; Ids[Id]++; next; }
$1 in Ids
' /file1 /file2
id=ram;*between*hkjhdswklf kjsdklhglshglkhgklsdgkhdfg
id=taikah;jhdjfkhg**kjdfkjksfdjk dfkjskdfjkljdflkjsdflj
Note que a outra solução Awk será muito lenta para arquivos grandes, já que é O (N 2 ). A sed
versão funcionará, mas, pessoalmente, acho que sed
é ilegível para os meros mortais.