Para o comando awk, você está faltando apenas a verificação para ver se a chave do arquivo1 foi vista no arquivo2
awk 'FNR==NR{a[$1]=$2 FS $3;next} $1 in a {print $0, a[$1]}' file2 file1 > output
# ................................^^^^^^^
Eu tenho dois arquivos: Arquivo1
ARS-BFGL-BAC-10975 0.9303 688423261 1 01/04/2015 0.9983763305
ARS-BFGL-BAC-11025 0.9092 688423261 1 01/04/2015 0.9983763305
ARS-BFGL-BAC-11044 0.9626 688423261 2 01/04/2015 0.9983763305
ARS-BFGL-BAC-11193 0.9544 688423261 1 01/04/2015 0.9983763305
ARS-BFGL-BAC-10975 0.9303 688423263 1 01/04/2015 0.9983763305
ARS-BFGL-BAC-11025 0.9092 688423263 1 01/04/2015 0.9983763305
ARS-BFGL-BAC-11044 0.9626 688423263 2 01/04/2015 0.9983763305
ARS-BFGL-BAC-11193 0.9544 688423263 1 01/04/2015 0.9983763305
Arquivo2:
ARS-BFGL-BAC-10975 10 21225382
ARS-BFGL-BAC-11025 10 84516867
ARS-BFGL-BAC-11193 1 29303546
Saída desejada
ARS-BFGL-BAC-10975 0.9303 688423261 1 01/04/2015 0.9983763305 10 21225382
ARS-BFGL-BAC-11025 0.9092 688423261 1 01/04/2015 0.9983763305 10 84516867
ARS-BFGL-BAC-11193 0.9544 688423261 1 01/04/2015 0.9983763305 1 29303546
ARS-BFGL-BAC-10975 0.9303 688423263 1 01/04/2015 0.9983763305 10 21225382
ARS-BFGL-BAC-11025 0.9092 688423263 1 01/04/2015 0.9983763305 10 84516867
ARS-BFGL-BAC-11193 0.9544 688423263 1 01/04/2015 0.9983763305 1 29303546
Portanto, o arquivo 1 tem muito mais linhas que o arquivo 2. Eu só quero manter as linhas na saída que estão no arquivo 2 com base na coluna1.
Eu tentei entrar, mas não consigo trabalhar direito - ele me dirá que meus arquivos não estão classificados
join -j 1 -o 1.1,1.2,1.3,1.4,1.5,1.6,2.2,2.3 <(sort -k1 file1) <(sort -k1 file2)
De preferência eu preferiria um comando awk. O arquivo 1 será muito grande. Eu tentei
awk 'FNR==NR{a[$1]=$2 FS $3;next}{ print $0, a[$1]}' file2 file1 > output
Qualquer ajuda seria muito apreciada. Obrigado
Desculpe eu não posso comentar abaixo, mas apenas para esclarecer o arquivo nem todas as linhas na coluna1 no arquivo 1 estarão no arquivo2.
O comando do awk
awk 'FNR==NR{a[$1]=$2 FS $3;next} $1 in a {print $0, a[$1]}'
só manterá a quantidade de linhas que existe no arquivo 2. Mas o ideal é que o ARS-BFGL-10975 seja repetido duas vezes (mais realisticamente mais) para aparecer duas vezes na minha saída.
Obrigado pela ajuda até agora
Para o comando awk, você está faltando apenas a verificação para ver se a chave do arquivo1 foi vista no arquivo2
awk 'FNR==NR{a[$1]=$2 FS $3;next} $1 in a {print $0, a[$1]}' file2 file1 > output
# ................................^^^^^^^
Usando seus dados de exemplo:
$ join <(sort file1) <(sort file2)
ARS-BFGL-BAC-10975 0.9303 688423261 1 01/04/2015 0.9983763305 10 21225382
ARS-BFGL-BAC-10975 0.9303 688423263 1 01/04/2015 0.9983763305 10 21225382
ARS-BFGL-BAC-11025 0.9092 688423261 1 01/04/2015 0.9983763305 10 84516867
ARS-BFGL-BAC-11025 0.9092 688423263 1 01/04/2015 0.9983763305 10 84516867
ARS-BFGL-BAC-11193 0.9544 688423261 1 01/04/2015 0.9983763305 1 29303546
ARS-BFGL-BAC-11193 0.9544 688423263 1 01/04/2015 0.9983763305 1 29303546
Isto aparece para fazer o que você quer que ele faça, além da ordenação das linhas na saída (que é classificada aqui, e eu não sei se isso é significativo para você ou não).
O campo de junção padrão é o primeiro campo, então -j 1
não é necessário (esta é uma extensão do GNU join
).
A saída padrão de join
: "Cada
linha de saída consiste no campo de junção, os campos restantes do arquivo1
e então os campos restantes do arquivo2 "(do manual do OpenBSD ). Isso significa que a especificação do campo de saída que você usou não é necessário, pois corresponde ao comportamento padrão.
Para sort
, -k1
é igualmente equivalente ao padrão.
Eu não sei o que causou a mensagem de erro que você recebeu usando acidentalmente sort -c
.