Tenho dois arquivos A e B. Cada linha em ambos os arquivos é considerada um item. O formato de cada item é fixo, composto por chave e descrição, separados por espaço. conforme mostrado no exemplo abaixo.
UASPCH-XCF02-XXB1CF02-UACF02-ih_CW100M2_0000027_0000104 /users/documents/ark
A primeira parte, UASPCH-XCF02-XXB1CF02-UACF02-ih_CW100M2_0000027_0000104
, é a chave, e a última parte, /users/documents/ark
, é a descrição. Os arquivos A e B possuem 1.000 e 100.000 itens, respectivamente. Cada chave pode ser dividida em duas partes: índice (por exemplo: UASPCH-XCF02-XXB1CF02-UACF02-ih_CW100M2
) e carimbo de data/hora (por exemplo: 0000027_0000104
) em nosso exemplo. Não há regra sobre dígitos no carimbo de data/hora. O caractere entre o índice e o carimbo de data/hora é fixado como _
. Cada chave é única e cada índice também é único no mesmo arquivo. Cada índice incluído no arquivo A também ocorreu no arquivo B com um carimbo de data/hora diferente. Conforme mostrado em um exemplo simples abaixo.
Arquivo A
UASPCH-XCF02-SP062-XXB2CF02-UACF02-ih_CW100M2_0000000_0000119 /users/documents/ark1
UASPCH-XCF02-XXB1CF02-UACF02-ih_CW100M2_0000027_0000104 /users/documents/ark2
Arquivo B
UASPCH-XCF02-SP062-XXB2CF02-UACF02-ih_CW100M2_0000002_0000118 /users/documents/ark3
UASPCH-XCF02-XXB1CF02-UACF02-ih_CW100M2_0000026_0000107 /users/documents/ark4
UASPCH-XXM16-XXXB1M16-XUAM16-ih_CW100M3_0000039_0000129 /users/documents/ark5
Quero substituir a descrição correspondente ao mesmo índice no arquivo B pela descrição correspondente ao índice no arquivo A. O resultado no exemplo é mostrado abaixo.
Arquivo B
UASPCH-XCF02-SP062-XXB2CF02-UACF02-ih_CW100M2_0000002_0000118 /users/documents/ark1
UASPCH-XCF02-XXB1CF02-UACF02-ih_CW100M2_0000026_0000107 /users/documents/ark2
UASPCH-XXM16-XXXB1M16-XUAM16-ih_CW100M3_0000039_0000129 /users/documents/ark5
Como atingir esta meta?
Isso pode funcionar para você (GNU sed):
Crie um script sed do arquivoA para aplicar ao arquivoB.
Cada linha no arquivoA é transformada em uma correspondência e uma substituição. O índice é usado como correspondência e sua descrição é usada na substituição e então aplicada ao arquivoB. As linhas correspondentes terão a descrição do arquivoA.
NB O uso de delimitadores alternativos em ambos os comandos de substituição. Se for provável que a descrição contenha o
#
caractere, use outro caractere como delimitador que não esteja presente em nenhuma descrição.Solução em TXR Lisp:
Código:
Ou usando
awk
macro para verificar os arquivos; mas caso contrário, a mesma abordagem:Usando qualquer awk:
O procedimento acima funcionará mesmo que alguma de suas "descrições" contenha espaços em branco, por exemplo, dada esta entrada:
ainda obtemos a saída desejada: