File1.txt
item1 carA
item2 carB
item3 carC
item4 platD
item5 carE
File2.txt
carA platA
carB platB
carC platC
carE platE
Saída desejada:
item1 platA
item2 platB
item3 platC
item4 platD
item5 platE
Como eu posso fazer isso?
command-line
text-processing
awk
pawana
fonte
fonte
Eu sei que você disse
awk
, mas há umjoin
comando para esse fim ...Seria suficiente com o primeiro
join
comando se não fosse para esta linha:O comando basicamente diz: junção com base na segunda coluna do primeiro arquivo (
-1 2
) e na primeira coluna do segundo arquivo (-2 1
) e gera a primeira coluna do primeiro arquivo e a segunda coluna do segundo arquivo (-o 1.1,2.2
). Isso mostra apenas as linhas que emparelhadas. O segundo comando join diz quase a mesma coisa, mas diz para mostrar as linhas do primeiro arquivo que não puderam ser emparelhadas (-v 1
) e gerar a primeira coluna do primeiro arquivo e a segunda coluna do primeiro arquivo (-o 1.1,1.2
). Depois, classificamos a saída de ambos combinados.sort -k 1
significa classificar com base na primeira coluna esort -k 2
significa classificar com base na segunda. É importante classificar os arquivos com base na coluna de junção antes de passá-los parajoin
.Agora, escrevi a classificação duas vezes, porque não gosto de desarrumar meus diretórios com arquivos, se eu puder ajudar. No entanto, como David Foerster disse, dependendo do tamanho dos arquivos, convém classificá-los e salvá-los primeiro para não ter que esperar para classificar cada um duas vezes. Para dar uma idéia dos tamanhos, eis o tempo necessário para classificar 1 milhão e 10 milhões de linhas no meu computador:
São 1,5 segundos para 1 milhão de linhas e 19 segundos para 10 milhões de linhas.
fonte
%E
no formato de hora) é menos interessante para medir o desempenho computacional. O tempo de CPU do modo de usuário (%U
ou simplesmente umaTIMEFORMAT
variável não configurada ) seria muito mais significativo.%U
.