Linux에서 diff 파일 간의 데이터 처리

Linux에서 diff 파일 간의 데이터 처리

2개의 로그 파일 이름이 있고 Attendance. Position현재 있는 모든 군인의 위치를 ​​알고 싶습니다(). 이 두 파일 사이에서 이 작업을 어떻게 수행할 수 있습니까?

출석 파일

여기에 이미지 설명을 입력하세요.

위치 파일

여기에 이미지 설명을 입력하세요.

grep군인의 현재 이름을 얻기 위해 그것을 사용하려고 생각했습니다 . 하지만 다른 파일에서 위치를 어떻게 얻을 수 있습니까?

답변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

당신은 그것을 사용할 수 있습니다diffLinux에서 두 파일을 비교하는 명령입니다. 귀하의 설명에 따르면 이는 귀하의 요구 사항을 충족해야 합니다.

diff -y Attendance Position | grep YES > newfile

이렇게 하면 두 파일이 나란히 표시되어 YES라는 줄만 표시되고 출력이 다음으로 전송됩니다.새로운 파일

답변3

또한 시도

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

관련 정보