答案1
你的直觉是对的,grep
首先是所有拥有Yes属性的战士。然后使用 提取名称awk
并将其填充到 array 或 secondary 中grep
。提取姓名并不那么复杂(假设文件名是Attendance):
<Attendance grep 'Yes' | awk '{print $2}'
现在取决于结果集有多大。如果这产生 <50 个要查找的名称,您可以简单地将结果作为参数传递给位置文件上的下一个 grep。如果有更多的命令行参数,超出了 shell 支持的命令行参数的数量,请编写一个小的(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)
当您的名字包含空格时,这将无法正常工作,例如分割姓氏和姓名、头衔、等级等。由于您需要更多属性以及某种距离和时间近似值 - 也许并非每个士兵都有给定时间戳的确切位置 - 我建议向开发人员付费。
您还可以扩展哈希表的键属性位置存储和以后查找条目。
答案2
您可以使用diff
Linux 中比较两个文件的命令。根据您的描述,这应该可以满足您的需求。
diff -y Attendance Position | grep YES > newfile
这将并排显示两个文件,仅显示带有 YES 的行,并将输出发送到新文件
答案3
也试试
grep YES file1 | cut -f2 -d" " | grep -f- file2