如何在 Unix 中制作类似于 Excel 的 vlookup 功能的东西?
摘自办公室网站,VLOOKUP
VLOOKUP 中的 V 代表垂直。当比较值位于要查找的数据左侧的列中时,请使用 VLOOKUP 而不是 HLOOKUP。
语法 VLOOKUP(lookup_value,table_array,col_index_num,range_lookup)
Lookup_value 要在表数组的第一列中搜索的值。Lookup_value 可以是值或引用。如果lookup_value 小于table_array 第一列中的最小值,则VLOOKUP 返回#N/A 错误值。
Table_array 两列或更多列数据。使用对范围或范围名称的引用。table_array 第一列中的值是lookup_value 搜索到的值。这些值可以是文本、数字或逻辑值。大写和小写文本是等效的。
Col_index_num table_array 中必须从中返回匹配值的列号。col_index_num 为 1 返回 table_array 第一列中的值;col_index_num 为 2 返回 table_array 中第二列中的值,依此类推。如果 col_index_num 是:
小于 1,VLOOKUP 返回 #VALUE!错误值。大于 table_array 中的列数,VLOOKUP 返回 #REF!错误值。
Range_lookup 一个逻辑值,指定您希望 VLOOKUP 查找精确匹配还是近似匹配:
1GR_P1:001PI
:040VG_L1
:001PO_L3
1JPI_P1:001PO_L1
1JPI_P1:001PO_L2
Run Code Online (Sandbox Code Playgroud)
1JPI_P1:001PO_L1 1401UC
1JPI_P1:001PO_L2 1401UC
1HIK_P2:001ER 1402UC
1GR_P1:001PI 1402UC
Run Code Online (Sandbox Code Playgroud)
1GR_P1:001PI 1402UC
:040VG_L1 NA
:001PO_L3 NA
1JPI_P1:001PO_L1 1401UC
1JPI_P1:001PO_L2 1401UC
Run Code Online (Sandbox Code Playgroud)
没有一个通用函数可以将 avlookup
作为 Unix 中的通用函数。相反,您正在提供“砖块”,您可以从中以更定制化的方法构建问题的解决方案。这些“砖块”是诸如grep
、awk
、 等工具sed
。
其中一种工具,awk
可以如下使用:
FNR==NR{
a[$1]=$2
next
}
{ if ($1 in a) {print $1, a[$1]} else {print $1, "NA"} }
Run Code Online (Sandbox Code Playgroud)
$ awk -f vlookup.awk file2 file1
1GR_P1:001PI 1GR_P1:001PI
:040VG_L1 NA
:001PO_L3 NA
1JPI_P1:001PO_L1 1JPI_P1:001PO_L1
1JPI_P1:001PO_L2 1JPI_P1:001PO_L2
Run Code Online (Sandbox Code Playgroud)
您可以使用该column
命令来清理输出:
$ awk -f vlookup.awk file2 file1 | column -t
1GR_P1:001PI 1GR_P1:001PI
:040VG_L1 NA
:001PO_L3 NA
1JPI_P1:001PO_L1 1JPI_P1:001PO_L1
1JPI_P1:001PO_L2 1JPI_P1:001PO_L2
Run Code Online (Sandbox Code Playgroud)
上面的awk
脚本将 file2 的所有内容放入一个数组中,该数组使用该值作为键进行索引。
a[$1]=$1
Run Code Online (Sandbox Code Playgroud)
一旦file2
被读入 array a
,file1
然后一次通过一行并做出决定。如果 的第一列的file1
值存在于数组中a
,则 的file2
第 2 列中的相应值将与的第 1 列一起打印file1
。如果不存在,则打印“NA”消息。
如果您正在寻找可以从命令行运行的东西,请查看awk
. 这是一个非常流行的程序,用于各种解析操作。http://en.wikipedia.org/wiki/AWK
此外,很难在不提及 UNIX 中解析文本的情况下提及grep
. grep
用于正则表达式匹配文本。虽然此特定应用程序不需要它,但如果您正在进行大量文本解析,它最终会派上用场。
http://en.wikipedia.org/wiki/Grep
使用colrm
可以从流中剪切文本列。当您在使用 隔离文本时遇到困难时,这会很有用awk
。
sed
如果要解析的文本很长或者 awk 无法轻松完成您想要的任务,那么您将需要使用它。维基百科上的 Sed
我确信我遗漏了几十个,但是这个例子你所需要的只是awk
这样你就可以了。