Como classificar e juntar de acordo com o número / contador dentro do arquivo?

2

Eu quero juntar dois arquivos de acordo com o número no arquivo, dois numeram o mesmo arquivo

Toyota   model1 
BMW      model2
Benz     model3
BMW      model4 
BMW      model5
Benz     model6 
Benz     model7

e segundo arquivo

class C    model1
class E    model2
class A    model3
class W    model4
class W    model5
class C    model6
class A    model7

Eu quero juntar os dois arquivos de acordo com o número, assim, unindo cada número de modelo em um arquivo.

Toyota      class C  model1
BMW         class E  model2
Benz        class A  model3
BMW         class W  model4 
BMW         class W  model5  
Benz        Class C  model6
Benz        Class A  model7

depois disso, exclua a string 'model'

Meu código

sort -V file1 > new_file1 
sort -V file2 > new_file2 
join newfile1 new_file2 > result.txt
sed 's/model[(1-9)]//g' result.txt > result_1.txt

o problema que estou recebendo um erro ao juntar os arquivos

join: file1.txt:10: is not sorted: 03Benz   model   249
join: file2.txt:4: is not sorted: BMW   model   2

e se eu quiser contar a frequência depois disso

   ( this pair happen in the text 2 times) after joined 
Toyota      class C  1
BMW         class E  1
Benz        class A  2
BMW         class W  2
Benz        Class C  1
    
por Lona gracia 13.03.2017 / 20:11

2 respostas

1

Use join .

Parece que alterar o primeiro caractere de espaço no arquivo para algo diferente de espaço será suficiente para converter os registros delimitados por espaços em branco de arquivos.

Aqui está uma implementação que substitui o primeiro espaço com % e depois é unida na segunda coluna de cada arquivo.

$ cat file2 | sed -e 's/ /%/' | join -1 2 -2 2 - file1

ou

$ <file2 sed -e 's/ /%/' | join -1 2 -2 2 - file1

que produz

model1 class%C Toyota
model2 class%E BMW
model3 class%A Benz
model4 class%W BMW
model5 class%W BMW
model6 class%C Benz
model7 class%A Benz

Se você precisar convertê-lo em um formato delimitado por tabulação, use tr .

tr ' %' '\t ' 
    
por 13.03.2017 / 22:17
0

A associação é a ferramenta correta e você não precisa de nenhuma outra conversão além dos arquivos classificados.

join -12 -23 -o 1.1 2.1 2.2 0 file1 file2 |column -t
Toyota  class  C  model1
BMW     class  E  model2
Benz    class  A  model3
BMW     class  W  model4
BMW     class  W  model5
Benz    class  C  model6
Benz    class  A  model7

A associação é por padrão campos de tratamento com separação de espaço.
Opção -12 significa primeiro arquivo segundo campo
Opção -23 significa segundo arquivo terceiro campo
Opção -o significa saída de formato:
  1.1 = file1 campo 1
  2.1 = arquivo2 campo 1
  0 = campo comum / associado

Aplique LC_ALL = C na frente dos comandos sort e join para garantir a classificação correta e a junção correta (ou seja, arquivo de classificação LC_ALL = C)

Sobre a parte da contagem, você pode fazer algo assim:

join -12 -23 -o 1.1 2.1 2.2 0 file1 file2 |cut -d' ' -f1-3 |sort |uniq -c
      1 BMW class E
      2 BMW class W
      2 Benz class A
      1 Benz class C
      1 Toyota class C

Você pode ver os dois testes acima on-line aqui.

    
por 14.03.2017 / 00:47