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] = $2a[$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期望两个文件按相同的顺序排序。

相关内容