В то время как другие ответы могут помочь, вот как я делаю то же самое:
Вы можете использовать командуdiff
для сравнения двух файлов в Linux. Это должно работать для того, что вам нужно, основываясь на вашем описании.
diff -y Attendance Position | grep YES > newfile
Это отобразит оба файла рядом, отобразив только строки с YES, и отправит вывод в новый файл
Ваша интуиция верна, grep
во-первых, для всех солдат с атрибутом Да -. Затем извлеките имя с помощью awk
и заполните его массивом или вторым grep
. Извлечение имен не так уж сложно (, если имя файла Attendance):
<Attendance grep 'Yes' | awk '{print $2}'
Теперь это зависит от того, насколько велик результирующий набор. Если это дает <50 имен для поиска, вы можете просто поместить результат в качестве параметров для следующего grep в файле Position -. Если их намного больше, чем количество параметров командной строки, поддерживаемых вашей оболочкой, напишите небольшой скрипт (Bash -). Поместите куски имен в массив и переберите все прочитанные строки, чтобы найти совпадения.
С более чем 10 000 записей в журнале, работайте поблочно, так (также включая другие комментарии, как файл сценария Bash):
#!/bin/bash
declare -A position
# build up a hash table through preformatted Bash-statements
while read i; do
eval "$i"
done < <(awk '{print "position['\''"$2"'\'']='\''"$3"'\''"}' Position)
echo "read ${#position[@]} positions"
# Lookup positions from the hash table
while read name; do
pos="${position[$name]}"
if [ -z "$pos" ]; then
pos="-"
fi
echo "$name $pos"
done < <(awk '/YES/ { print $2 }' Attendance)
Это не будет работать правильно, если ваше имя содержит пробелы, например. разделить фамилию и имя, звания, звания и тому подобное. Поскольку вам нужно больше атрибутов, а также какое-то приближение расстояния и времени — возможно, не у каждого солдата есть точная позиция для данной временной метки — я предлагаю заплатить разработчику.
Вы также можете расширить атрибут ключа -для позиции хэш-таблицы для хранения и последующего поиска записей.