두 파일을 한 줄씩 비교하고 그 중 몇 개가 위나 아래로 이동했는지 확인하는 방법은 무엇입니까? [폐쇄]

두 파일을 한 줄씩 비교하고 그 중 몇 개가 위나 아래로 이동했는지 확인하는 방법은 무엇입니까? [폐쇄]

"파일 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년 순위 대학 목록만 포함하는 파일을 출력하고 싶습니다.

예상 출력에는 데이터가 포함된 두 개의 파일이 포함되어야 합니다.

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

(두 번째 파일의 끝에서 두 번째 줄에 "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);
}

관련 정보