Como comparar dois arquivos linha por linha, para verificar quantos deles foram movidos para cima ou para baixo? [fechadas]

2

'Arquivo A' tem lista de universidade classificada no ano, digamos 2018, 'Arquivo B' tem lista de universidade classificada no ano de 2017,

Arquivo A (2018 Classificações):

University of Oxford
University of Cambridge
California Institute of Technology
Stanford University
Massachusetts Institute of Technology

Arquivo B (2017 Classificações):

University of Oxford
California Institute of Technology
Stanford University
University of Cambridge
Massachusetts Institute of Technology

'Stanford University' está em 4º lugar em 2018, enquanto em 3º em 2017. Então, eu quero uma saída de arquivos que contenha apenas a universidade em 2017, que foi acima de Stanford em 2018, similarmente, lista de universidade que foi classificado em 2017, que foi abaixo de Stanford em 2018 rankings.

A saída esperada deve conter dois arquivos com dados,

**Ranked above Stanford: **
University of Cambridge

**Ranked below Stanford: **
NONE

NONE - Como nenhuma universidade foi classificada acima de stanford em 2017, os rankings ficaram abaixo do standford em 2018.

Eu quero poder fazer isso para qualquer universidade mencionada na lista.

Os dados inseridos aqui são trechos de arquivos de dados enormes, eles contêm mais de 1000 listas de universidades classificadas. Quero analisar isso apenas para poucas universidades.

    
por CCC 08.09.2017 / 12:08

2 respostas

2

Abaixo resposta após pergunta esclarecida de forma correta, aqui está a solução final para isso:

awk -F'\n' -v RS='Stanford University' 
    'NR==1 && NR==FNR{for (i=1;i<NF;i++)above[$i]++;next}
     NR==2&&NR==FNR{for (j=2;j<NF;j++)below[$j]++;next} 
     NR==3{for (x=1;x<NF;x++)X2017[$x]++;next}
     NR==4{for (y=2;y<NF;y++)Y2017[$y]++;next} 
END{ for (Z in Y2017) {if (Z in above) print Z>"Ranked-above.txt" }; 
     for (T in X2017) {if (T in below) print T>"Ranked-below.txt" };
}' 2018  2017

A saída seria dois arquivos Ranked-above.txt e Ranked-below.txt com resultado esperado.

**Ranked-above.txt**
University of Cambridge

**Ranked-below.txt**

Você pode procurar por outras Universidades com especificação em RS='University NAME HERE'

    
por 08.09.2017 / 12:48
2

Esta não é uma resposta à sua pergunta, no sentido de que ela não produz a saída que você solicitou. No entanto, ele produz uma tabela de mudanças nas classificações entre as linhas nos dois arquivos.

O seguinte programa awk mostrará a mudança na classificação entre os dois arquivos da seguinte forma:

$ awk -f script.awk rankings-2017.txt rankings-2018.txt
        University of Oxford
 +2     University of Cambridge
 -1     California Institute of Technology
 -1     Stanford University
NEW     Uppsala University
 -1     Massachusetts Institute of Technology

("Uppsala University" foi adicionada na segunda à última linha do segundo arquivo).

O script:

NR == FNR       { rank[++n] = $0 }
NR != FNR       { ++nn;
    for (i = 1; i <= n; ++i) {
        if (rank[i] == $0) {
            if (i == nn) {
                printf("   ");
            } else {
                printf("%+3d", i - nn);
            }
            printf("\t%s\n", $0);
            next;
        }
    }
    printf("NEW\t%s\n", $0);
}
    
por 08.09.2017 / 17:53