파일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