Farei minha pergunta com um exemplo. Eu tenho 2 arquivos:
Arquivo 1:
118D FC300_R5_TP FX.B 32775 2112 6 2038 6 2112 0
118E FC300_R5_TP FX.B 32775 2136 7 2065 6 2136 0
118F FC300_R5_TP FX.B 32775 2124 6 2064 6 2124 0
1190 FC300_R5_TP FX.B 819210 814632 99 814609 99 814632 0
1191 FC300_R5_TP FX.B 819210 104100 13 103714 13 104100 0
1192 FC300_R5_TP FX.B 1638420 1609476 98 1609402 98 1609476 0
1196 FC300_R5_TP FX.B 1638420 1638432 100 1638379 100 1638432 0
119A FC300_R5_TP FX.B 3276840 3271776 100 3271698 100 3271776 0
119E FC300_R5_TP FX.B 3276840 3264120 100 3264034 100 3264120 0
11A2 FC300_R5_TP FX.B 3276840 2328648 71 2328546 71 2328648 0
11A6 FC300_R5_TP FX.B 3276840 2328444 71 2328355 71 2328444 0
11AA FC300_R5_TP FX.B 3276840 2328528 71 2328403 71 2328528 0
11AE FC300_R5_TP FX.B 3276840 2328648 71 2328468 71 2328648 0
11B2 FC300_R5_TP FX.B 3276840 2130000 65 2129766 65 2130000 0
173A FC300_R5_TP FX.B 6553680 6478572 99 6477747 99 6478572 0
Arquivo 2:
11AA FC300_R5_TP FX.B 3276840 2328528 71 2328403 71 2328528 0
11AE FC300_R5_TP FX.B 3276840 2328648 71 2328468 71 2328648 0
11B2 FC300_R5_TP FX.B 3276840 2130000 65 2129766 65 2130000 0
173A FC300_R5_TP FX.B 6553680 6478572 99 6477747 99 6478572 0
0BDB FC600_R5_TP FX.B 33554640 6044364 18 6033105 18 6044364 0
0BDC FC600_R5_TP FX.B 33554640 6613536 20 6481974 19 6613536 0
0BDD FC600_R5_TP FX.B 33554640 4435848 13 4057170 12 4435848 0
0BDE FC600_R5_TP FX.B 33554640 6620868 20 6249518 19 6620868 0
Saída desejada
Arquivo nº 3:
0BDB FC600_R5_TP FX.B 33554640 6044364 18 6033105 18 6044364 0
0BDC FC600_R5_TP FX.B 33554640 6613536 20 6481974 19 6613536 0
0BDD FC600_R5_TP FX.B 33554640 4435848 13 4057170 12 4435848 0
0BDE FC600_R5_TP FX.B 33554640 6620868 20 6249518 19 6620868 0
Eu gostaria de comparar o arquivo 1 e o arquivo 2 usando as primeiras colunas e remover a linha ou linha inteira do arquivo 2 onde elas correspondem no arquivo 1. Eu também gostaria de salvar os resultados em um terceiro arquivo, o arquivo nº 3.
fonte
Relataria as linhas que estão apenas dentro
f2
.Relataria as linhas
f2
cujo primeiro campo não foi encontrado como o primeiro campo em qualquer linha def1
.(você precisa de um shell com suporte para substituição de processos como
ksh93
,zsh
oubash
).fonte
Apenas por diversão, aqui está uma solução no Perl:
Exemplo
Detalhes
A solução Perl acima é composta por 2 loops. O primeiro loop lê todas as linhas de
file1
e cria um hash,%names
onde cada coluna que identificamos é adicionada.O segundo
while
loop é executado sobre o segundo arquivo,file2
e a coluna 1 de cada linha é identificada usando a expressão regular:O texto acima diz, desde o início da linha, que corresponde a tudo que não é um espaço e salve-o na variável temporária
$1
. Ele é salvo ao envolver parênteses em torno dele. O.*
diz para combinar com tudo o mais na linha.O próximo bit de que as linhas diz para procurar o bit coluna 1 que acabou de salvar no
$1
no%names
Hash:Se estiver presente lá, não queremos imprimi-lo. Se não estiver lá, imprima-o.
fonte
Método 1 # Bash
Método 2 # Somente Grep
grep está funcionando, mas não garante
fonte
Vamos obtê-lo como
Arquivo # 1: file1.txt
Arquivo # 2: file2.txt
Em seguida, execute o seguinte no terminal
output.txt conterá os resultados desejados.
Explicação:
fonte