A questão está marcada com awk , mas acho que vale a pena notar que você não tem para usar awk
para fazer isso. Os coreutils têm um utilitário join
que é útil para esse tipo de coisa, embora com seus dados seja um pouco complicado.
Eu vou assumir que seu shell é bash e GNU coreutils. Isso pode ser feito com outros tipos, mas provavelmente precisará de mais pré / pós-processamento de seus dados.
Sem mais delongas:
join -t"|" -14 -22 -o"$(echo 1.{1..8} 2.1)" \
<(sort -t"|" -k4 file1.txt) \
<(sort -t"|" -k2 file2.txt) \
| grep -Po ".*([\d]+)(?=\|$)"
join
recebe dois arquivos de entrada e os associa aos campos aprovados pelos parâmetros -1
e -2
. -t
indica um separador de campo personalizado nos arquivos de entrada. join
requer que os arquivos de entrada sejam classificados nos campos que estão sendo unidos, portanto, os dois arquivos de entrada são classificados nas substituições do processo antes de serem passados para join
. O parâmetro -o
especifica como os campos devem ser enviados. Por padrão, é o campo join, seguido pelos campos non-join do arquivo1, seguidos pelos campos non-join do arquivo2, portanto, precisamos especificar que queremos todos os campos do arquivo 1 em ordem, seguidos pelo campo 1 do arquivo 2.
Você também exige que a associação esteja no campo 8 do arquivo1 e no campo 1 do arquivo1. Isto é simplesmente implementado aqui, usando as linhas quando os campos de saída de junção 8 e 9 são os mesmos. Usar um lookahead de regexp com grep -Po
nos permite fazer isso e efetivamente excluir o campo 9 para fornecer a saída necessária. A saída é:
78Z|696931836|0000001|ANT09|2160203|A|1114450|2222222222
78Z|011512345|0000001|ANT09|2160218|D|0319230|4444444444
78Z|033333157|0000001|ANT10|2160208|A|1900460|3333333311
78Z|099999999|0000001|ANT32|2160219|A|0319000|6666666666
78Z|010041586|0000001|ANT33|2160119|A|1835100|3333333333
78Z|012344052|0000001|ANT50|2160203|A|1219570|5555555555