不区分大小写的awk vlookup

时间:2017-01-16 05:41:48

标签: awk ksh

我试图使用awk对文件中的第一列进行不区分大小写的vlookup,但它忽略IGNORECASE并且不使用相同的awk匹配如何比​​较第3列

awk -F, 'BEGIN{IGNORECASE=1} FNR==NR{a[$1]=$3","$4;next} {print (($1 in a) ? $0","a[$1] : $0",NA,NA");}'

cat f1.txt
FOO,LONDON,45,789
goo,US,46,9876

cat f2.txt
FOO,LONDON,45,789
GOO,US,46,9876


awk -F, 'BEGIN{IGNORECASE=1} FNR==NR{a[$1]=$3","$4;next} {print (($1 in a) ? $0","a[$1] : $0",NA,NA");}' f1.txt f2.txt

FOO,LONDON,45,789,45,789
GOO,US,46,9876,NA,NA

1 个答案:

答案 0 :(得分:0)

请参阅以下GNU Awk页面摘录

  

另一种特定于gawk的方法是将变量IGNORECASE设置为非零值(请参阅内置变量)。当IGNORECASE不为零时,所有正则表达式和字符串操作都会忽略大小写。

     

通常,您不能使用IGNORECASE使某些规则不区分大小写,而其他规则区分大小写,因为没有直接的方法来为特定规则的模式设置IGNORECASE .17为此,请使用括号表达式或的tolower()的。但是,只能对IGNORECASE执行一项操作,即可同时为所有规则动态打开或关闭区分大小写。

因此,请将GNU Awk's tolower()函数用作输入,

awk -F, 'FNR==NR{a[tolower($1)]=$3","$4;next} {print ((tolower($1) in a) ? $0","a[tolower($1)] : $0",NA,NA");}' f1.txt f2.txt
FOO,LONDON,45,789,45,789
GOO,US,46,9876,46,9876