Intereting Posts
Обновления золотого изображения в qemu Не удается скомпилировать ядро: ошибка, ядро ​​не поддерживает режим PIC Как транслировать локальное видео на веб-камеру, используя ffmpeg? Объединить поля в файл 4G на встроенном ядре 2.6.32.9 на Parrot AR Drone 2.0 Обмен терминалом с несколькими пользователями (с экраном или иным способом) Скрипт для преобразования каталога сценариев ksh в сценарии bash? Сколько оперативной памяти, дискового пространства и времени процессора используется скриптом Как заставить порты pulseaudio быть доступными Резервное копирование большого файла Как контролировать буферизацию труб в сценариях bash? Arch Linux Kde – уменьшить количество панельных приложений Является ли один bash shellshock для исправления файла tar для SLES? Путь администрирования Weblogic слишком медленный Есть ли способ отключить панель инструментов с плазмоидами, которая появляется, когда мышь находится над виджетами / плазмоидами?

Как сравнить два файла по строкам, чтобы проверить, сколько из них перемещено вверх или вниз?

В «Файле А» есть список университетов в год, скажем, 2018, «Файл Б» имеет список университетов, которые были ранжированы в 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 

«Стэнфордский университет» занял 4-е место в 2018 году, тогда как он был третьим в 2017 году. Итак, я хочу получить файлы, которые содержат только университет, рейтинг которого в 2017 году, который превысил рейтинг Стэнфорда в 2018 году, аналогично, список университетов, который был оценен в 2017 году, который ушел ниже Стэнфорда в 2018 году.

Ожидаемый результат должен содержать два файла с данными,

 **Ranked above Stanford: ** University of Cambridge **Ranked below Stanford: ** NONE 

НЕТ – Поскольку ни один университет не был оценен выше stanford в 2017 году, рейтинги пошли ниже standford в рейтинге 2018 года.

Я хочу иметь возможность сделать это для любого университета, упомянутого в списке.

Данные, введенные здесь, являются фрагментами из огромных файлов данных, они содержат 1000+ списков университетского рейтинга. Я хочу проанализировать это только для нескольких университетов.

Ниже ответа после выяснения правильного вопроса, вот окончательное решение для этого:

 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 

Результатом будет два файла Ranked-above.txt и Ranked-below.txt с ожидаемым результатом.

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

Вы можете искать другие университеты с указанием в RS='University NAME HERE'

Это не ответ на ваш вопрос в том смысле, что он не дает требуемого результата. Тем не менее, он создает таблицу изменений рангов между строками в двух файлах.

Следующая 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); }