如何逐行比较两个文件,检查其中有多少个文件向上或向下移动?

如何逐行比较两个文件,检查其中有多少个文件向上或向下移动?

“文件 A”有 2018 年排名的大学列表,“文件 B”有 2017 年排名的大学列表,

文件A(2018年排名):

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

文件B(2017年排名):

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

“斯坦福大学”在 2018 年排名第四,而在 2017 年排名第三。因此,我想要输出仅包含 2017 年排名大学的文件,该大学在 2018 年排名高于斯坦福大学,类似地,排名大学列表2017年排名低于斯坦福大学2018年排名。

预期输出应包含两个具有数据的文件,

**Ranked above Stanford: **
University of Cambridge

**Ranked below Stanford: **
NONE

无 - 由于没有大学在 2017 年排名高于斯坦福大学,因此在 2018 年排名低于斯坦福大学。

我希望能够为列表中提到的任何大学执行此操作。

此处输入的数据是来自庞大数据文件的片段,其中包含 1000 多个大学排名列表。我只想针对几所大学进行分析。

答案1

下面的答案以正确的方式澄清了问题,这是最终的解决方案:

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

输出将是两个文件排名-above.txt排名低于.txt与预期结果。

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

**Ranked-below.txt**

您可以搜索其他大学并指定RS='University NAME HERE'

答案2

这不是您问题的答案,因为它不会产生您所需的输出。但是,它确实会生成两个文件中行之间排名变化的表格。

以下awk程序将输出两个文件之间排名的变化,如下所示:

$ 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

(“乌普萨拉大学”已添加到第二个文件的倒数第二行)。

剧本:

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);
}

相关内容