“文件 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);
}