我想使用 File2 (标准文件)的字段打印 File1 中的匹配字符串。我尝试过下面的 awk 命令,但只打印第一行结果,相反我想从 File1 字符串中获取所有匹配的字段。
cat File1
AAA,20190221,00-00,100
AAA,20190221,01-00,110
AAA,20190221,02-00,120
BBB,20190221,00-00,110
BBB,20190221,01-00,110
BBB,20190221,02-00,110
CCC,20190221,00-00,110
CCC,20190221,01-00,140
CCC,20190221,02-00,150
cat File2
AAA
BBB
我正在使用下面的 awk 方法,
awk -F"," -f vlookup.awk File1 File2
(cat vlookup.awk)
FNR==NR{
a[$1]=$4
next}
{ if ($1 in a) {print $1"," a[$1]} else {print $1, "NA"} }
我得到的输出为
AAA,100
BBB,110
NA
但我需要打印 File1 中的所有值,这些值可能会不时地增加或减少。我的预期输出是
AAA,100
AAA,110
AAA,120
BBB,110
BBB,110
BBB,110
答案1
您的 AWK 脚本将File1
第 1 列中每个键的第 4 列的最后一个值保存到数组中,a
并使用第 1 列作为索引。然后它打印 中存在的所有数组键和值File2
。
您应该更改输入文件的顺序并创建一个键数组 from File2
,然后将 from 的行File1
与该数组进行比较。
vlookup2.awk
FNR==NR {
a[$0]=1 # Set a value in array a using current line as index
next # Stop processing this line, do not check other rules
}
$1 in a { # if column1 matches any index in array a
print $1 "," $4 # the columns you want
}
跑步
awk -F "," -f vlookup2.awk File2 File1
要得到
AAA,100
AAA,110
AAA,120
BBB,110
BBB,110
BBB,110
注意:我使用 File2 作为第一个参数。
顺便说一句:您的 AWK 脚本、示例文件和输出似乎有问题。我得到两条线
AAA,120
BBB,110
这是 File1 中的最后几行,其对应的键位于第 1 列中。您的示例输出显示了 的第一行AAA
。
我得到一条线
NA
(前面有一个空格NA
)仅当 File2 后面包含空行时BBB
。