Use awk
awk 'NR==FNR{ seen[$1FS$2]=$3FS$4; next } { print $0, seen[$6FS$7] }' file2 file1
e para excluir linhas vazias da saída:
awk 'NR==FNR{ seen[$1FS$2]=$3FS$4; next } NF{ print $0, seen[$6FS$7] }' file2 file1
ou um pouco de espaços em branco e nomes de variáveis sensíveis são muito úteis para a legibilidade. Além disso, aproveite o uso de uma vírgula na chave da matriz
awk '
NR == FNR {value[$1,$2] = $3 OFS $4; next}
{print $0, value[$6,$7]}
' file2.txt file1.txt
-
NR
é definido como 1 quando o primeiro registro lido por awk e incrementando para cada próximo registro de leitura em arquivos de entrada únicos ou múltiplos até que todas as leituras sejam concluídas. -
FNR
é definido como 1 quando o primeiro registro for lido por awk e incrementado para cada próximo registro de leitura no arquivo atual e redefinido como 1 para o próximo arquivo de entrada, se houver vários arquivos de entrada. -
então
NR == FNR
é sempre uma condição verdadeira e o bloco seguido por isso executará ações apenas no primeiro arquivo. -
O
seen
é uma matriz awk associada com a combinação de teclas da coluna $ 1 e coluna $ 2 com o valor da coluna $ 3 e da coluna $ 4. -
O token
next
pula para executar o restante dos comandos e eles serão executados apenas para o (s) próximo (s) arquivo (s), exceto o primeiro. -
NF
; predefinindo N umber de F campos em um registro onde os campos são conhecidos e separados por um F campo S eparator% código%; entãoFS
entre as colunas usadas para intacto o separador de campos ou você poderia usar commaFS
no array. -
assim, este
,
, imprime o registro atualNF{ print $0, seen[$6FS$7] }
no arquivo1 e o valor corresponde à coluna $ 6 e coluna $ 7 presentes no array visto quando não era uma linha vazia.