2つのファイルを1行ずつ比較し、それらのうちのいくつかが上下に移動したかどうかを確認する方法は? [閉鎖]

2つのファイルを1行ずつ比較し、それらのうちのいくつかが上下に移動したかどうかを確認する方法は? [閉鎖]

「ファイル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年4位、2017年3位を占めた。それで、2018年のスタンフォード大学よりも高い順位を占めた2017年のランキング大学と、2018年のスタンフォード大学よりランクの低い2017年のランキング大学のリストだけを含むファイルを出力したいと思います。

期待される出力には、データを含む2つのファイルを含める必要があります。

**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

出力は2つのファイルですランキング-above.txtそして.txt より低いランク期待される結果として。

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

**Ranked-below.txt**

他の大学を検索して指定できます。RS='University NAME HERE'

答え2

これはあなたが求める結果を生成しないので、あなたの質問に対する答えではありません。ただし、2 つのファイルの行間のランク変更のテーブルが作成されます。

awkのプログラムは、次のように2つのファイル間のランク変更を出力します。

$ 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

(2番目のファイルの最後の2行目に「Uppsala University」が追加されました)。

スクリプト:

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

関連情報