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

Я удалил свой файл load-balancer.conf в папке /etc/nginx/conf.d/ и создал файл default.conf. файл. Я добавил

server_name tomcat-test.com;

после порта listen в .conf и перезапустил службу. Теперь все работает.

1
18.11.2018, 17:52
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 вне фигурных скобок {...} просто означает «истина», поэтому выполняется действие по умолчанию - печать строки.

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

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

Последняя команда Awk берет строки, которые были спарены, т. Е. Строки, в которых число N поля F больше 3 ( NF> 3 ), и добавляет их четвертое поле ко второму полю, добавляет их пятое поле к их третьему полю, а затем усекает четвертое и пятое поля.

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

(См. этот учебник для получения дополнительной информации и правильного изучения 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'

И посмотрите, не имеет больше смысла.

0
28.01.2020, 01:07

Неэлегантный bash , присоединиться , и вариант 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
0
28.01.2020, 01:07

Теги

Похожие вопросы