在Linux中处理差异文件之间的数据

在Linux中处理差异文件之间的数据

我有 2 个日志文件名AttendancePosition.我想知道在场的所有士兵的位置(是的)。我该如何在这两个文件之间执行此操作。

考勤档案

在此输入图像描述

位置文件

在此输入图像描述

我想到用它grep来获得士兵的现名。但接下来我该如何从另一个文件中获取他们的位置。

答案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

您可以使用diffLinux 中比较两个文件的命令。根据您的描述,这应该可以满足您的需求。

diff -y Attendance Position | grep YES > newfile

这将并排显示两个文件,仅显示带有 YES 的行,并将输出发送到新文件

答案3

也试试

grep YES file1 | cut -f2 -d" " | grep -f- file2

相关内容