UNIX의 vlookup 함수, 열이 변경됨

UNIX의 vlookup 함수, 열이 변경됨

file2 file1.txt의 값이 아닌 변수에 저장된 값을 보내는 것이 가능한가요? 위 쿼리에서 변수를 전달하는 방법을 알려주세요. 쿼리에 변수를 전달하려고 했지만 변수가 값을 단일 행으로 저장하고 원하는 출력을 얻을 수 없습니다.

당신의 답변에 감사드립니다. 위의 file1 및 file2 값이 명령 출력이고 이를 변수에 저장하고 있는데 이 쿼리에서 이러한 변수를 전달하는 방법을 알고 싶습니다. 이것이 분명하기를 바랍니다.

[p001 ~]$ cat file1 
30042020
29042020
28042020
27042020
26042020
25042020
24042020

[p001 ~]$ cat file2 
303 30042020
259 29042020
288 28042020
402 27042020
75  26042020
207 25042020

[p9147724_local@dotenprlpbas001 ~]$ var1=$(cat file1) 
[p9147724_local@dotenprlpbas001 ~]$ var2=$(cat file2) 

[p001 ~]$ awk 'NR == FNR{ a[$2] = $1; next } { print $1, a[$1]+0 }' "$var2" "$var1" 
awk: fatal: cannot open file `303 30042020 259 29042020 288 28042020 402 27042020 75 26042020 207 25042020' for reading (No such file or directory) 

예상 출력:

30042020 303
29042020 259
28042020 288
27042020 402
26042020 75
25042020 207
24042020 0 

답변1

a[$1] = $2다음과 같이 변경하면 됩니다 a[$2] = $1.

awk 'NR == FNR{ a[$2] = $1; next }; { print $1, $1 in a?a[$1]: "0" }' file2 file1

그러나 이는 다음과 같이 단축될 수 있습니다.

awk 'NR == FNR{ a[$2] = $1; next } { print $1, a[$1]+0 }' file2 file1

고쳐 쓰다: 명령 출력에서 ​​입력을 읽습니다.CommandX&명령 Y.

awk 'NR == FNR{ a[$2] = $1; next } { print $1, a[$1]+0 }' <(cmdY) <(cmdX)

만약에사용중인 쉘은 프로세스 교체를 지원하지 않습니다: 다음을 수행할 수 있습니다.

( cmdY | ( cmdX | (
awk '
    NR == FNR{ a[$2] = $1; next } { print $1, a[$1]+0 }
' /dev/fd/3 /dev/fd/4 ) 4<&0 ) 3<&0 )

답변2

join유틸리티는 적중 항목을 일치시킬 수 있지만 누락 항목을 일치시키려면 두 번째 패스와 printf형식 지정이 필요하며 다음을 인쇄합니다 0.

join -2 2 file{1,2} ; printf '%s 0\n' $(join -v 1 -2 2 file{1,2})

참고: join두 파일이 모두 동일한 순서로 정렬될 것으로 예상합니다.

관련 정보