Bash: Имея 2 файла, как я могу проверить, появляется ли второе имя в первом случае во втором

Итак, проблема немного сложнее, чем

У меня есть 2 файла, скажем file1 и file2, каждый со следующими данными:

name of the game, hours spent playing it, last 7 days 

file1:

 game1 100 20 game3 40 5 

file2:

 game1 90 25 game4 40 2 

Цель: случай, когда игра находится в обоих файлах, вычесть часы, потраченные на воспроизведение файла1 – file2

case показывает только на file1, покажет его, но как оригинал (file1 – 0)

case показывает только на file2, показывается, но как отрицательный результат исходного (0 – file2)

как я могу это сделать в bash?

2 Solutions collect form web for “Bash: Имея 2 файла, как я могу проверить, появляется ли второе имя в первом случае во втором”

Ответ от манжеты, если файлы отсортированы:

 awk '{$2= -$2; $3= -$3} 1' file2 | join -a1 -a2 file1 - | awk 'NF > 3 {$2+=$4; $3+=$5; NF=3} 1' 

Выход на предоставленный вход:

 game1 10 -5 game3 40 5 game4 -40 -2 

(Если файлы не отсортированы, просто сортируйте их и держите их отсортированными. Это упростит работу.)


Обратите внимание, что здесь используются только функции POSIX для join и POSIX-функций Awk , поэтому он будет работать практически в любом месте.


$2 в Awk – это ссылка на второе поле. $3 – ссылка на третье поле (каждой строки обработанного файла). 1 появляющийся вне брекетов {...} просто означает «true», поэтому выполняется действие печати по умолчанию.

По сути, первая команда Awk просто превращает числа в file2 в отрицательные числа.

Команда join присоединяет file1 к тексту, предоставленному на его стандартном входе (что он получает от Awk). Файл после file1 в команде join (а не другое имя файла) означает «использовать стандартный ввод». Параметры -a1 и -a2 означают, что любые неустранимые строки в первом или втором файле выводятся как есть.

Окончательная команда Awk берет линии, которые были сопряжены, то есть строки, где N umber F ields больше 3 ( NF > 3 ), и добавляет свое четвертое поле во второе поле, добавляет свое пятое поле в свое третье поле, а затем усекает четвертое и пятое поля.

Опять же, заключительные 1 внешние фигурные скобки используются для запуска действия по умолчанию Awk, «print».

(См. Этот учебник для получения дополнительной информации и обучения Awk должным образом.)


Здесь многое происходит. Я рекомендую запускать каждую часть этих команд перед добавлением следующей части. Первый:

 awk '{$2= -$2; $3= -$3} 1' file2 

и изучать и понимать это. Затем:

 awk '{$2= -$2; $3= -$3} 1' file2 | join -a1 -a2 file1 - 

И изучите и поймите это. (Также попробуйте оставить флаги -a1 и -a2 или оставить только один из них.)

Затем используйте полную команду:

 awk '{$2= -$2; $3= -$3} 1' file2 | join -a1 -a2 file1 - | awk 'NF > 3 {$2+=$4; $3+=$5; NF=3} 1' 

И посмотрим, имеет ли это смысл.

Inelegant bash , join и вариант GNU sed :

 join -a1 -a2 -o 0 1.2,2.2,1.3,2.3 file1 <(sed 's/ \([0-9]*\)/ -\1/g' file2) | \ sed 's/ -/-/g;s/[0-9]*-[0-9]*/$((&))/g;s/.*/echo &/eg' 

Вывод:

 game1 10 -5 game3 40 5 game4 -40 -2 
  • Как извлечь файл из приглашения?
  • Как установить переменную окружения для моих скриптов так же, как оболочка пользователей?
  • найти проблему в скрипте bash
  • Поиск файлов более поздним, чем один день, и копия
  • Как выбрать опцию из меню выбора из сценария?
  • Конкатенация строковой переменной внутри цикла for в оболочке bash
  • Скрипт оболочки Unix, параметры с пробелами
  • grepping конкретная матрица и печать в одной строке
  • В чем смысл конечного «:» (двоеточия) в * nix?
  • Как выполнить скрипт, расположенный в том же каталоге, что и текущий скрипт?
  • Сценарий оболочки для запуска приложения Node.js с помощью Gulp каждые два часа
  • Interesting Posts

    Должны ли имена подкоманд Unix быть чувствительными к регистру?

    Есть ли дистрибутив Linux, скомпилированный с clang / llvm?

    Согласование RegEx + удаление дополнительной строки

    мосты, VLAN и RSTP

    Сортировка слов в каждой строке, редактирование файла на месте

    Как я могу запустить `watch` в качестве фоновой работы?

    Для набора номеров строк … Извлеките контент между первым и последним появлением разных шаблонов

    Несколько кукловодов за балансиром нагрузки

    Объединение совпадающих столбцов с двумя файлами или использование значения по умолчанию

    Как включить Wi-Fi с помощью клавиатуры (Dell Inspiron 14r) в suse Linux 11.4

    PHP Startup: невозможно загрузить динамическую библиотеку: не удается открыть файл общих объектов: нет такого файла или каталога

    Defrag range ioctl не поддерживается в этом ядре, попробуйте без каких-либо опций

    Какая встроенная платформа Linux поддерживает Suspend to RAM?

    Virtfs (Plan 9) vs NFS как инструмент для общей папки для виртуальной машины

    awk + gsub + как работать со всеми типами символов

    Linux и Unix - лучшая ОС в мире.