서로 다른 두 파일의 두 열을 비교하고 새 파일에 출력을 표시합니다.

서로 다른 두 파일의 두 열을 비교하고 새 파일에 출력을 표시합니다.

파일1.txt

psid   task   status 

1       a1      run
2       a2      run
3       a3      stop
4       a4      run     
5       a5      stop

파일2.txt

a1      stop
a2      stop
a3      run
a4      run 
a5      stop

출력 -

task    status      ok
a1      run         nok
a2      run         nok
a3      stop        nko
a4      run         ok  
a5      stop        ok

file1과 file2의 작업 및 상태 열을 비교하고 작업 및 상태와 문자열이 포함된 새 파일에 데이터를 표시하고 "nok"가 아닌 경우 "ok"를 표시하고 싶습니다.

이것이 내가 시도한 것이지만 false 조건에서 작동하지만 true에서도 false를 표시합니다.

awk -F, 'NR==FNR{ arr[$2]=$2 $1; next } 
{ print $0, (arr[$2]==$2 $3?"ok":"nok") }' OFS=, file2.txt file1.txt

답변1

이제 무엇을 시도했는지 살펴보겠습니다.

awk -F, 'NR==FNR{ arr[$2]=$2 $1; next }
{ print $0, (arr[$2]==$2 $3?"ok":"nok") }' OFS=, file2.txt file1.txt
  • -F,필드 구분 기호를 쉼표로 설정합니다. 이는 파일을 보면 잘못된 것입니다.
  • arr[$2]=$2 $1의 키 필드는 file2.txt이( $1가) 아닙니다 $2.
  • 에 할당하는 필드 순서가 arr전환됩니다. 첫 번째 부분에서는 을 할당하고 $2 $1두 번째 부분은 이지만 그 다음 $2 $3이어야 합니다 $3 $2. 아니면 그 반대의 경우도 마찬가지입니다. 첫 번째 부분 $1 $2
    하지만실행/중지 값만 할당하면 충분합니다!

따라서 솔루션에 가장 가까운 작업 버전은 다음과 같습니다.

awk 'NR==FNR{ arr[$1]=$2 $1; next }
{ print $0, (arr[$2]==$3 $2?"ok":"nok") }' OFS=, file2.txt file1.txt

하지만 나는 이렇게 할 것이다:

awk '
    NR==FNR{ arr[$1]=$2;next;}
    FNR>2{ print $2,$3,(arr[$2]==$3?"ok":"nok") }
 ' file2.txt file1.txt

관련 정보