Intereting Posts
Есть ли инструмент для сопоставления открытого текста eryptfs и зашифрованных имен файлов? Как исправить ошибку zramswap? Временно игнорировать / обходить настройки прокси с помощью iptables, когда WFH Почему мой системный блок не запускается при перезагрузке сервера? Линукс командной строки может подключаться, но веб-сервер (или php) не может подключиться TCL скрипт try catch псевдоним tcsh со сложными аргументами cmds, quotes и cmd Fedora 21 больше не загружается; Компьютер хочет, чтобы я исполнял руководство МОК История в оболочке Almquist в NetBSD Как я могу передать позиционный параметр, сценарий bash требует, чтобы он был недоступен? Python файл не выполняется правильно через systemd Подходы, чтобы запретить пользователю удалять домашнюю папку Запустите службу при загрузке и автоматически обновите ее, если она умирает под AIX Что может сделать bash: подсветка синтаксиса, подсказка git и автозаполнение основаны на середине слова? Bash – Как сделать каждый выбор меню в 1 строке вместо нескольких выборов в 1 строке

Добавить в файл1 по различиям в конкретном столбце между двумя файлами

Я хотел бы сравнить два файла и только распечатать эту строку и добавить ее в «source.txt»:

01.02.70 08h00,4.4.4.4,443 

Вот мои файлы:

source.txt

 DATETIME,IPSOURCE,PORT 01.01.70 08h00,0.0.0.0,443 01.01.70 08h00,2.2.2.2,443 

events.txt

 DATETIME,IPSOURCE,PORT 01.02.70 09h00,0.0.0.0,443 01.02.70 09h00,2.2.2.2,443 01.02.70 08h00,4.4.4.4,443 

Я не забочусь о поле DATETIME в сравнении, я только хочу добавить новый IP-адрес, который появляется в файле журнала «events.txt», в «source.txt» (адреса 0.0.0.0 и 2.2.2.2 появляются в два файла).

Поэтому я хочу использовать

 grep -vxFf source.txt events.txt 

не принимая во внимание первое поле, я рассматриваю только различия в поле IPSOURCE (второй столбец).

Использовать awk когда вам требуется сопоставление на основе полей

 $ awk -F, 'NR==FNR{ip[$2]=$0; next} $2 in ip{delete ip[$2]} END{for(k in ip) print ip[k]}' events.txt source.txt 01.02.70 08h00,4.4.4.4,443 
  • -F, set , качестве разделителя полей ввода
  • NR==FNR{ip[$2]=$0; next} NR==FNR{ip[$2]=$0; next} использовать второе поле как ключ и сохранить целую строку в ассоциативном массиве. Этот блок кода будет выполняться только для первого ввода файла (например, events.txt)
  • $2 in ip{delete ip[$2]} когда обрабатывается второй файл (т.е. source.txt), удаляет элементы в массиве ip если второе поле уже присутствовало
  • END{for(k in ip) print ip[k]} после обработки всех данных, строки печати, оставшиеся в ip массиве

Или измените порядок входных файлов и строк печати из event.txt, если второе поле отсутствует в source.txt

 $ awk -F, 'NR==FNR{ip[$2]; next} !($2 in ip)' source.txt events.txt 01.02.70 08h00,4.4.4.4,443 

Просто выполните:

 awk -F, 'NR==FNR{arr[$2]=$0;next} !($2 in arr)' source event #>> source 

Если вы хотите иметь добавленную разностную строку на основе второго столбца с полями, разделенными запятой, просто Uncomment >> source в приведенной выше команде.

НЕТ, если вы хотите сравнить на основе IP: Порт. то вы можете использовать следующее.

 awk -F, 'NR==FNR{arr[$2FS$3]=$0;next} !($2FS$3 in arr)' source event #>> source 

Согласно вашим условиям:

  • добавьте его в "source.txt"

  • Я хочу только добавить новый IP-адрес, который отображается в файле журнала «events.txt» в «source.txt»,


Вот полное решение, основанное на сочетании GNU sed , cut и grep :

 sed -i "\$ a $(cut -d, -f2 source.txt | grep -vf - events.txt)" source.txt 

В результате source.txt файла source.txt :

 DATETIME,IPSOURCE,PORT 01.01.70 08h00,0.0.0.0,443 01.01.70 08h00,2.2.2.2,443 01.02.70 08h00,4.4.4.4,443