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 
  • Сценарий оболочки для запуска программы с аргументами
  • Команды Unix для генерации случайного алфавита
  • Поиск строки в выводе команды
  • Определение функции оболочки: почему есть место после открытия скобки?
  • Запустить сценарий оболочки без отображения всех журналов
  • if else в одной строке с использованием && и ||
  • Перенаправить вывод команды в два разных файла
  • Запрос базы данных в цикле while
  • Поиск последнего символа имени базового файла
  • Функция не выполняется в скрипте
  • Вложенный сценарий в сценарии bash
  • Interesting Posts
    Linux и Unix - лучшая ОС в мире.