У меня есть два массива, я пытаюсь найти совпадающие значения, используя comm
.Array1
содержит некоторую дополнительную информацию в каждом элементе, которую я вырезал для сравнения.Однако я хотел бы сохранить эту информацию после завершения сравнения.
Например:
Array1=("abc",123,"hello" "def",456,"world")
Array2=("abc")
declare -a Array1
declare -a Array2
Затем я сравниваю два массива:
oldIFS=$IFS IFS=$'\n\t'
array3=($(comm -12 <(echo "${Array1[*]}" | awk -F "," {'print $1'} | sort) <(echo "${Array2[*]}" | sort)))
IFS=$oldIFS
Какойнаходит совпадение abc
:
echo ${test3[0]}
abc
Однако я хочу, чтобы оставшиеся значения из массива1 не были частью моего оператора comm
.
abc,123,hello
РЕДАКТИРОВАТЬ: для большей ясности
Массивы в этом примере заполнены фиктивными данными.
Мой реальный пример - извлечение информации из журналов сервера, которую я сохраняю в array1.array1 содержит (userIDs, hostIPs, count), которые я хочу сопоставить со списком userID's (array2).Моя цель состоит в том, чтобы выяснить, какие userID существуют в array1 и array2, и сохранить эти идентификаторы с дополнительной информацией из array1 (hostIPs, count) в array3
array1 заполняется из переменной, которая является результатом скручивания.команда, которая генерирует поисковый запрос.Возвращенные данные выглядят следующим образом:
"uniqueID=<ID>","<IP>","<hostname>",1
Я сохраняю результаты отчета spunk как $ splunk, а затем декалярую array1 с результатами $ splunk - информация заголовка, поскольку результаты возвращаются в формате csv
array1=( $(echo $splunk | sed 's/ /\n/g' | sed 1d) )
array2 генерируется из мастер-файла, который я хранил локально.Он содержит все идентификаторы приложений в нашей экосистеме.Например,
uid=<ID>
Я помещаю содержимое мастер-файла в массив2
array2=( $(cat master.txt) )
Затем я хочу найти, какие идентификаторы из массива1 существуют в массиве2, и сохранить его как массив3.Это требует некоторого массива данных в массиве 1, чтобы он соответствовал формату массива 2.
oldIFS=$IFS IFS=$'\n\t'
array3=($(comm -12 <(echo "${array1[*]}" | sed 's/ /\n/g' | awk -F "\"," {'print $1'} | sed 's/\"//g' | sed 's/|/ /g' | awk -F$'=' -v OFS=$'=' '{ $1 = "uid" }1' | grep -i "OU=People" | sed 's/OU/ou/g' | sort) <(echo "${array2[*]}" | sort)))
IFS=$oldIFS
массив 3 будет содержать строки, совпадающие в обоих массивах
uid=<ID>
uid=<ID>
Однако яищу что-то еще по линии
"uid=<ID>","<IP>","<hostname>",1
"uid=<ID>","<IP>","<hostname>",1