linux:使用一个文件到另一个文件的vlookup

linux:使用一个文件到另一个文件的vlookup

我想使用 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

相关内容