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
두 파일이 모두 동일한 순서로 정렬될 것으로 예상합니다.