답변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에서 두 파일을 비교하는 명령입니다. 귀하의 설명에 따르면 이는 귀하의 요구 사항을 충족해야 합니다.
diff -y Attendance Position | grep YES > newfile
이렇게 하면 두 파일이 나란히 표시되어 YES라는 줄만 표시되고 출력이 다음으로 전송됩니다.새로운 파일
답변3
또한 시도
grep YES file1 | cut -f2 -d" " | grep -f- file2