preservando a ordem de campo em um 'join'

0

Digamos que eu tenha dois arquivos como este:

1   a   one ...
2   b   two ...
3   c   three   ...
4   d   four    ...
5   e   five    ...
6   f   six ...

e

a
c
f

Existe uma maneira, não saber o número de colunas no arquivo 1 (ou não ter que repetir cada campo), eu posso usar join para obter as linhas correspondentes

1   a   one ...
3   c   three   ...
6   f   six ...

Eu tentei

join -1 2 -o 1.0 file1 file2

como se você fosse escrever $0 para obter todos os campos em awk , mas eu obviamente obtenho invalid field number .

    
por n.caillou 26.07.2017 / 16:56

1 resposta

1

Você pode escolher quais campos imprimir em qual ordem ou imprimir todos os campos em ordem padrão. Mas você não pode imprimir "o resto dos campos".

De man join :

-o FORMAT
       obey FORMAT while constructing output line
[...]
Any FIELD is a field number counted from 1. FORMAT is one or
more  comma or blank separated specifications, each being
'FILENUM.FIELD' or '0'.

Você pode usar o awk:

awk -v regex="$(head -c -1 file2 | tr '\n' '|')" '$2 ~ regex' file1
  • Remova a última nova linha do arquivo2 e substitua as novas linhas por '|', a expressão regular será a|c|f
  • Corresponde ao segundo campo do arquivo1 com esse regex

Ou use a solução awk do Sundeep especialmente se o arquivo2 contiver caracteres especiais.

    
por 26.07.2017 / 17:31

Tags