答え1
あなたの直感が正しいです。grep
まずはい属性を持つすべての戦士です。次に、を使用して名前を抽出し、awk
それを配列またはセカンダリに埋めますgrep
。名前を抽出することはあまり複雑ではありません(ファイル名がAttendanceであると仮定)。
<Attendance grep 'Yes' | awk '{print $2}'
これで、結果セットのサイズによって異なります。検索する名前が50未満の場合は、結果を場所ファイルの次のgrepに引数として渡すことができます。シェルがサポートするよりも多くのコマンドライン引数がある場合は、小さな(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で2つのファイルを比較するコマンドです。あなたの説明によると、これはあなたの要件を満たす必要があります。
diff -y Attendance Position | grep YES > newfile
これにより、2つのファイルが並んで表示され、YESという行だけが表示され、出力が次に送信されます。新しいファイル
答え3
また試み
grep YES file1 | cut -f2 -d" " | grep -f- file2