![UNIX 中的 vlookup 函数,列已更改](https://linux22.com/image/172284/UNIX%20%E4%B8%AD%E7%9A%84%20vlookup%20%E5%87%BD%E6%95%B0%EF%BC%8C%E5%88%97%E5%B7%B2%E6%9B%B4%E6%94%B9.png)
是否可以发送存储在变量中的值而不是 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
更新:从命令的输出读取输入指令X&指令Y。
awk 'NR == FNR{ a[$2] = $1; next } { print $1, a[$1]+0 }' <(cmdY) <(cmdX)
如果您使用的 shell 不支持进程替换: 您可以执行以下操作:
( 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
期望两个文件按相同的顺序排序。