Unir arquivos (grandes) em um padrão alfanumérico

3

Eu tenho:

Arquivo 1 como:

sting_of_printable_characters*sting_of_printable_characters*sting_of_printable_characters*ALPHANUMERIC_PATTERN

Arquivo 2 como:

sting_of_printable_characters*ALPHANUMERIC_PATTERN

onde * é um separador de campo e o padrão alfanumérico é sempre o último campo na linha.
Estou completamente confuso sobre como alcançar o seguinte e gostaria de receber alguma ajuda.

Eu preciso essencialmente "participar" (eu tentei o comando join e parece não funcionar com teclas alfanuméricas) esses dois arquivos baseados em "ALPHANUMERIC_PATTERN", e só imprimo onde ambos os arquivos contêm o mesmo ALPHANUMERIC_PATTERN.

Eu preferiria usar awk devido a sua eficiência de processamento, mas tudo seria muito útil. (Esses arquivos são grandes.)

O problema é que preciso ver a saída semelhante à abaixo:

ALPHANUMERIC_PATTERN*stuff_from_file_1*stuff_from_file_2
    
por Josh Harrington 13.10.2015 / 19:03

2 respostas

2

Com join , você pode tentar assim:

join -t\* \
<(sed 's/\(.*\)\(\*\)\(.*\)//' file1 | sort -t\* -k1,1) \
<(sed 's/\(.*\)\(\*\)\(.*\)//' file2 | sort -t\* -k1,1)

Os dois sed s movem o último campo para o início da linha, por exemplo,

field1*field2*...field(N-1)*field(N)

torna-se

field(N)*field1*field2*...*field(N-1)

os resultados são então sort ed no campo 1 st e, em seguida, join ed (sempre no campo 1 st). Isto irá imprimir linhas como:

field(N)*fields(1)to(N-1)*from*file1*fields(1)to(N-1)*from*file2 

Se você preferir trabalhar com arquivos temporários e salvar o resultado join em, por exemplo, outfile :

sed 's/\(.*\)\(\*\)\(.*\)//' file1 | sort -t\* -k1,1 > sorted_1
sed 's/\(.*\)\(\*\)\(.*\)//' file2 | sort -t\* -k1,1 > sorted_2
join -t\* sorted_{1,2} > outfile
rm -f sorted_{1,2}
    
por 13.10.2015 / 20:36
1

Você pode ingressar no último campo diretamente, contanto que o número de campos seja fixo:

join -t \* -1 4 -2 2 file1 file2
ALPHANUMERIC_PATTERN*sting_of_printable_characters*sting_of_printable_characters*sting_of_printable_characters*sting_of_printable_characters

Claro que ambos os campos precisam ser classificados no campo no qual você deseja se juntar. Se não, você pode usar a técnica don_crissti mostrou

joint -t \* -1 4 -2 2 <(sort -k4 file1) <(sort -k2 file2)
    
por 13.10.2015 / 20:39